安裝:
windows安裝git-- msysgit是windows版的git,下載單獨的.exe按照默認選項安裝即可? 在開始菜單找git-->git bash,會跳出命令行窗口,表示安裝成功。輸入命令git config --global user.name“你的名字” gitconfig --global user.email“你的郵箱”進行設置
創建版本庫(repository):
? ? mkdir 要創建的目錄名
? ? cd 要創建的目錄名
? ? pwd -->這個命令是顯示當前目錄的
? ? git init -->把目錄變成git可管理的倉庫,此時看到路徑有.git,若沒有,可能默認隱藏了,通過ls -ah命令可以看到
添加文件:
? ? git add文件名-->添加文件,回車后窗口并沒有給什么反應
? ? git commit -m“本次說明”-->把文件提交到倉庫,-m后面輸入的是本次提交的說明
? ? 另外說明:為什么需要add和commit兩步呢?因為commit可以一次提交多個文件
例如:gitadd file1.txt
? ? ? ? ? ?git add file2.txt file.txt
? ? ? ? ? ?git commit -m“add 3 file.”
時光機穿梭:
git status -->若更改文件內容,可以通過這個命令查看當前狀態,是否被修改了,修改后是否提交
git diff文件名-->可以查看根據命令輸出看到哪里做了修改 修改后提交的步驟依然是add commit,在commit之前運行status看一下當前倉庫狀態
git status -->可以看到要提交的包括剛剛修改的文件,然后commit一下,繼續status
git status -->會告訴我們沒有需要提交的修改,工作目錄是干凈的(working directory clean)
git log -->查看提交的歷史記錄,從最近到最遠的方式顯示
git log --pretty=oneline -->看到的一長串是commit
id(版本號),是SHA1計算出來的用十六進制表示的數字
時光機:
git reset --hard HEAD^ -->回退到上一個版本
cat文件名-->查看當前版本的內容,看一下是不是我們要回退的這個版本,此時log已經看不到最新那個版本記錄
git reset --hard最新版本的前幾位commit id -->回到最新版本,如果找的多個版本號,cat一下看看內容 不要忘記git commit
git reflog -->可以查看每一次命令的commit id
工作區(working directory)和暫存區(stage):
add是把工作區文件添加進暫存區,commit是從暫存區到分支上(版本庫包括暫存區和分支),必須先add到暫存區,才能commit到分支上
撤銷修改:
git checkout --文件名-->在工作區的修改全部撤銷,一是修改后還沒有add到暫存區,就回到和版本庫一樣的狀態,就是回到最近一次commit的狀態;一是已經add暫存區,又做了修改,是回到add暫存區的狀態,就是最近一次add的狀態。
git reset HEAD文件名-->把暫存區的修改撤銷(unstage),重新回到工作區,checkout--文件名丟棄工作區的修改
gitreset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當用HEAD時,表示最新版本。
刪除文件:
rm文件名-->在工作區刪除一個已經提交了的文件,現在是版本庫和工作區不一致,status可以看到哪些被刪了:
一是確定是要刪掉這個文件,
? ? git rm
?? ?git commit-->通過這兩個命令,文件就從版本庫中刪除了
一是刪錯了的情況,由于此時版本庫里還有這個文件
? ? git checkout --文件名-->現在就是回到最近的版本庫狀態了
遠程倉庫:(用github為例)
1,首先需要SSH KEY(在用戶主目錄下.ssh文件夾下有id_ras(私鑰)和id_ras.pub(公鑰)),沒有的話,打開Git Bash創建ssh-keygen -t rsa -C“你的郵箱”,然后一路回車
2,登錄github,打開account setting,ssh keys頁面,點擊add ssh key,填上任意title,在key里粘貼id_ras.pub文件的內容,然后點擊add key。(需要ssh是因為github需要識別推送的消息是否是你推送的)在github上創建倉庫,Create a new repo-->在repository name填寫倉庫名,其他地方默認,create repository,添加成功在新的界面可以看到github給的信息:可以從這個倉庫克隆新的倉庫,也可以與已有的本地倉庫進行關聯,把本地倉庫的內容push到github倉庫。
我們在本地倉庫運行如下命令:
git remote add origin git@github.com:github賬戶名/倉庫名.git
--> git對遠程庫默認的叫法--origin
下一步把本地內容推送到遠程:
git push -u origin master-->git push是把當前分支master推送到遠程。由于當前遠程是空的,第一次推送時加上了-u的參數,git會把本地master和遠程master關聯起來,后續的推送和拉取就可以簡化命令。
git push origin master-->后續就可以通過這個命令從本地進行提交
git push origin HEAD: 遠程分支名 -->本地分支名和遠程分支名不同的情況下用的命令(你必須在要push的本地分支上)
SSH警告:
第一次使用clone或者push命令連接github時會有警告,
這是因為SSH在第一次驗證github服務器的key時,需要確認gtithub的key指紋信息是否為來自github服務器,輸入yes即可,然后github反饋給你一個把key添加到本機的信任列表里了的警告,繼續yes(在輸入之前可以對照github的RAS key的指紋信息是否與SSH連接給出的一致)。
從遠程克隆倉庫:在github創建一個新的倉庫,需要勾選Initialize this repository with a README,這樣github會自動創建一個README.md文件。
git clone git@github.com:github賬號名/工程名.git-->把倉庫克隆到本地
cd倉庫名-->把git庫的地址切換成自己的
ls -->查看本地存在的文件。(git支持多種協議,包括https(速度慢,每次推送都必須輸入口令),ssh)
分支管理:
創建與合并分支--》HEAD指向master(當前分支),master指向提交,
git checkout -b分支名-->創建一個新的分支,-b(branch)表示創建并切換,相當于兩條命令,
git branch -->會列出所有分支進行查看,在當前分支前加*。
git checkout master-->回到master分支上
git merge要合并分支名-->用于合并指定分支到當前分支
git branch -d分支名-->刪除分支
git branch -f指定分支名要移動到的分支--》把指定的分支名移動到要移動的分支去
git reset local^/ git reset HEAD~1--》都是撤回本地分支local到它的父部
git revert HEAD --》撤回遠程分支最近提交的信息重新生成這個分支
git cherry-pick <commit1><commit2><...>--》如果你想將一些提交復制到你當前HEAD位置下,這是很直接的推進方式
git rebase -i HEAD~4 --》是指當前分支位置并包含當前位置往父部共4個位置進行一個界面化交互的操作
git commit --amend --》提交修改,在當前分支重新生成新的分支,棄用當前的
git describr -->用來顯示里當前分支最近的tag錨點,可以被commit的位置,沒有指定的話代表當前位置輸出信息:離最近的tag_這個tag離有多少commit_g當前id的前7位(v1_2_g3234rt5
git bisect一個找尋有bug的commit命令
git fetch從遠端獲取本地倉庫未包含的提交數據,即將本地對遠端的映射做了同步更新
git pull == git fetch;git merge在一起的效果
git pull --rebase是fetch和rebase的合用效果
git fakeTeamwork默認行為是在遠端master做一個提交
追蹤遠端的兩種方法:
1,git checkout -b分支名origin/master --》創建一個跟蹤origin/master的新分支(不是master了)
2,git branch -u origin/master分支名
git push :git push origin master--》切到master分支,抓取所有的提交推送到遠端的master分支,基本上用于同步兩倉庫(在分支上push后沒有參數命令是沒有效果的)
git push origin::git push origin foo^:master--》foo^指foo分支的父部,表示推送foo分支父部與遠端master同步,如果遠端的master是branch分支,實際是不存在的,git會在遠端為你創建。
git fetch origin foo(分支名)--》在本地foo分支進行遠端同步
git fetch origin ::git fetch origin foo~1:bar --》表示本地bar分支同步到遠端foo分支的父部;和push相似,但是方向相反,push是推送,fetch是下載
另外有兩種不需要的情況,這是通過空參數實現的。
1,git push origin :foo -->遠端會刪除foo這個分支
2,git fetch origin :foo --》本地會創建一個新的分支
^和~后不跟數字都是默認父部,跟數字,就從當前開始到數字的那個父部
(gitbranch bugWork HEAD~^2~創建分支bugWork同時移動到指定位置)
解決沖突,兩個分支同時更改了文件并都沒有更新提交后合并就會產生沖突,這是我們打開文件會看到git標記的沖突的地方,進行修改后,把沖突標記更改為已解決,然后在add提交合并。
git log --graph --pretty=oneline --abbrev-commit-->這個命令可以看到分支合并的情況
此時可以branch -d分支了。
分支管理:通常合并分支,如果可能,git會用fast forward模式,但是這種模式下刪除分支,會丟掉分支信息。如果禁用fast forward模式,git會在merge時生成新的commit,就可以從歷史看出分支信息
一個分支對文件進行更改并提交,但是合并時我們用了這個命令
git merge --no-ff -m "描述"要合并來的分支名--> --no-ff表示禁用fast forward
此時對分支進行刪除后
git log --graph --pretty=oneline --abbrev-commit
-->此時是可以看到分支的信息的
bug分支每個bug都可以通過一個新的臨時分支來修復,修復后合并分支,返回把臨時分支刪除。
git stash -->當前分支的任務進行到一半還不能提交,可以用此命令把當前工作現場“儲藏”,等后續恢復現場后繼續工作。此時可以在其他分支上創建臨時分支進行bug修復。修復完成后,提交合并,刪除臨時分支。
此時stash的那個分支,需要用到新的命令了
git stash list -->可以查看“儲藏”的分支,現在需要恢復一下,有兩種方法
1,git stash apply需要配合git stash drop來進行刪除stash“儲藏”的信息內容
2,git stash pop恢復的同時把stash內容也刪除
如果多次stash時,恢復時先git stash list查看,用git stash apply stash@{第幾個(從0開始計數)}feature分支開發一個新feature最好新建一個分支,如果要丟棄一個沒合并過的分支,使用git branch -D分支
多人協作克隆時git自動把本地master和遠程master對應起來,遠程倉庫默認名稱origin
git remote -->查看遠程倉庫信息
git remote -v -->顯示更詳細的信息
git push origin master -->推送master分支
多人協作的通常模式:
1,首先,可以試圖git push
origin分支名推送自己的修改
2,推送失敗,則因為遠程分支比你的本地更新,需要先git pull更新合并本地代碼
3,如果合并有沖突,解決沖突并在本地提交
4,沒有沖突或者已經解決掉后,用git
push origin分支名推送就可以成功了
如果git pull提示“no tracking information”,說明本地分支與遠程分支沒有創建鏈接,用命令git branch --set-upstream分支名origin/分支名創建鏈接(在本地創建和遠程分支對應的分支,git checkout -b分支名origin/分支名,名稱最好一致),如果有沖突要先處理沖突
標簽管理:
標簽和HEAD很像,但是不可以移動,是版本庫的一個快照,讓人更容易記住,更容易找的那個版本,標簽只存在本地,不會自動推送到遠程。
git tag標簽信息-->打標簽,默認為HEAD,也可以指定一個commit id。
git tag -->查看所有標簽信息,標簽信息不是按照時間順序,是按照字母順序的
git log --pretty=oneline --abbrev-commit -->找的歷史忘記需要打標簽但是忘記打標簽的commit id。
git tag標簽信息commit id -->對某個commit id打標簽
git show標簽信息-->查看這個標簽對應的版本信息,包括PGP簽名信息
git tag -a標簽信息-m“標簽說明”commit id --> -a指定標簽名,-m指定說明文字
git tag -s標簽信息-m“標簽說明”commit id -->可以通過-s用私鑰簽名一個標簽
簽名采用PGP簽名,所以要先安裝gpg(GnuPG),如果沒有或者沒有gpg密鑰對。會報錯,此時需要GnuPG文檔配置key。
git tag -d標簽信息-->如果標簽打錯了,可以通過這個命令刪除
git push origin標簽信息-->推送某個標簽信息到遠程
git push origin --tags -->一次性推送全部未推送到遠程的本地標簽
git push origin :refs/tags/標簽信息-->刪除一個遠程的標簽,先刪除本地標簽后,繼續這個命令,可以登錄github查看是否已經刪除
在github上如果你要修復別人的項目,點擊Fork,這是把這個項目克隆到你github的賬號下,然后繼續克隆到本地倉庫電腦上,這時你就可以干活了,完畢后推送到自己的github,如果要推送到別人的項目,你可以pull request,至于接不接受就看別人的心情而定了。
另外,git config --global color.ui true -->使git適當的顯示不同的顏色
忽略特殊文件:關于.gitignore文件,github已經準備了各種配置文件,https://github.com/github/gitignore所有配置文件可以直接在線瀏覽,當然.gitignore文件是需要放到版本庫的,并且可以對.gitignore做版本管理
忽略的原則:
1,忽略操作系統自動生成的文件,比如縮略圖
2,忽略編譯生成的中間文件、可執行文件等,也就是說如果一個文件是通過另一個文件自動生成的,那這個自動生成的文件就不用放進版本庫,比如.class
3,忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件
你要添加一個文件到git,發現添加不了,有一下兩個解決方法
git add -f文件名-->有可能是被.gitignore忽略了,可以用-f強制添加
git check-ignore -v文件名-->也有可能是.gitignore寫的有問題,需要找出寫錯的這個規則,可以用這個命令檢查
配置別名:這些命令單詞這么多真心不好記又容易寫錯,所以這時我們可以為這些命令換一個簡單的別名
git config --global alias.別名(st)命令(status)-->例如給status的別名是st,--golbal是全部參數,所以配置好就可以在這臺電腦的所以git倉庫下都有用,如果不加只對當前倉庫有效
git config --global alias. unstage 'reset HEAD'-->撤銷修改的別名,git reset HEAD文件名--> git unstage文件名
git config --global alias. last 'log -1' -->顯示最后一次提交的信息的別名配置
git config--global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'--abbrev-commit" -->這個配置出來的效果絢麗,是studio內的version control內的log的信息。
配置文件:首先配置文件是存放在.git/config文件中的。
cat .git/config -->出來的信息中[alias]的信息里是別名配置信息,要刪除別名,直接把對應的行刪掉即可
cat .gitconfig -->里面是[alias][user]的信息,配置別名可以直接修改這個文件,配置錯了,可以刪掉文件重新通過命令配置
搭建git服務器:
需要一臺Linux的機器(推薦使用Ubuntu/Debian,這樣可以幾條apt命令就可以安裝完成)
假設你已經有sudo權限的用戶賬號
1,sudo apt-get install git --》安裝git
2,sudo adduser git --》創建git用戶,用來運行git服務
3,創建證書登錄:收集所有要登錄的用戶公鑰(id_ras.pub文件),把所有公鑰導入到/home/git/.ssh/authorized_keys文件里,一行一個。
4,sudo git init --baresample.git --》初始化git倉庫,假設是/srv/sample.git,在/srv目錄下輸入這行命令,git會創建一個裸倉庫,裸倉庫是沒有工作區的,因為服務器上的git倉庫純粹是為了共享,所以不讓用戶登錄到服務器上去改工作區,并且服務器上的git倉庫通常是以.git結尾,sudo chown-R git:git sample.git --》把owner改為git
5,禁用shell登錄:安全考慮,第二步創建的git用戶不允許登錄shell,可以通過編輯/etc/passwd文件完成。git:x:1001:1001:,,,:/home/git:/bin/bash-->改為:git :x:1001:1001:,,,:/home/git:/usr/bin/git-shell,這樣git用戶可以正常通過ssh使用git,但是不能登錄shell,因為我們為git用戶指定的git-shell每次一登錄就自動退出
6,git clone git@server:/srv/sample.git --》通過命令克隆遠程倉庫,在各自電腦上運行當團隊人數很多時,公鑰就不能放在服務器的authorized_keys文件里這么玩了,此時用Ditosis來管理公鑰。
像svn那樣控制權限,用Gitolite
國外友人制作的git
cheat sheet:https://pan.baidu.com/s/1kU5OCOB#list/path=%2F(Git Cheat Sheet)
git官方網站:http://git-scm.com
本次總結來源于廖雪峰博客,網址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
另外附贈一份練習git的小游戲:http://learngitbranching.js.org/