Git常用命令手冊(cè)
閱讀前說明
本手冊(cè)總結(jié)了Git的常用命令,目的是方便平時(shí)使用Git可視化工具管理代碼的同事學(xué)習(xí)和查詢命令行下Git的命令,一些不常用的高級(jí)用法并沒有寫入
符號(hào)說明
- 中括號(hào) []
本文中使用中括號(hào) [] 表示要自定義輸入的內(nèi)容,例如git add [test.text]表示在命令行中輸入git add test.text
Git基礎(chǔ)操作
Git倉(cāng)庫(kù)創(chuàng)建
有兩種創(chuàng)建Git項(xiàng)目倉(cāng)庫(kù)的方法,第一種是在現(xiàn)存的目錄下,通過導(dǎo)入所有文件來創(chuàng)建新的 Git 倉(cāng)庫(kù)。第二種是從已有的 Git 倉(cāng)庫(kù)克隆出一個(gè)新的鏡像倉(cāng)庫(kù)。
- 在已有的工作目錄中創(chuàng)建Git倉(cāng)庫(kù):
打開命令行,輸入
cd [需要?jiǎng)?chuàng)建Git倉(cāng)庫(kù)的文件夾路徑]
移動(dòng)到需要使用Git管理的目錄下,可以直接將文件夾拖入命令行窗口快速輸入路徑,然后再輸入
git init
在當(dāng)前目錄下會(huì)出現(xiàn)一個(gè)名為 .git 的目錄,所有 Git 需要的數(shù)據(jù)和資源都存放在這個(gè)目錄中。不過目前,僅僅是按照既有的結(jié)構(gòu)框架初始化好了里邊所有的文件和目錄,但我們還沒有開始跟蹤管理項(xiàng)目中的任何一個(gè)文件。
如果當(dāng)前目錄下有幾個(gè)文件想要納入版本控制,需要先用
git add [fileName]
命令告訴 Git 開始對(duì)名字為fileName文件進(jìn)行跟蹤,也可以輸入
git add .
對(duì)該文件夾下的所有文件進(jìn)行跟蹤
然后
git commit -m [initial project version]
提交這次改動(dòng),所有被跟蹤的文件就被記錄進(jìn)Git的數(shù)據(jù)庫(kù)中。
- 從現(xiàn)有倉(cāng)庫(kù)克?。?br> 假設(shè)某項(xiàng)目在GitHub上的倉(cāng)庫(kù)地址為URL,輸入
git clone [URL]
如果希望在克隆的時(shí)候,自己定義要新建的項(xiàng)目目錄名稱,可以在上面的命令末尾指定新的名字
git clone [URL] [myProject]
新建的目錄名字會(huì)變成myProject。
Git 支持多種數(shù)據(jù)傳輸協(xié)議。之上面的例子使用的是 git:// 協(xié)議,也可以用 http(s):// 或者 user@server:/path.git 表示的 SSH 傳輸協(xié)議。
Git的工作流程
上一步我們已經(jīng)創(chuàng)建了一個(gè)Git倉(cāng)庫(kù),并將一些文件加入了跟蹤列表,在進(jìn)行下一步操作之前,我們有必要了解一下Git的工作流程:

我們創(chuàng)建Git倉(cāng)庫(kù)的目錄叫做工作目錄,工作目錄下面的所有文件處于兩種狀態(tài):已跟蹤或未跟蹤。已跟蹤的文件指使用git add命令加入版本控制管理的文件,工作一段時(shí)間后,它們的狀態(tài)可能是未更新,已修改或者已放入暫存區(qū)。而沒有加版本控制管理入都屬于未跟蹤文件。初次克隆某個(gè)倉(cāng)庫(kù)時(shí),工作目錄中的所有文件都屬于已跟蹤文件,且狀態(tài)為未修改。
在編輯過某些文件之后,Git將這些文件標(biāo)為已修改。我們可以把這些修改過的文件放到暫存區(qū)域,當(dāng)我們使用git commit命令后暫存區(qū)的文件會(huì)被保存進(jìn)數(shù)據(jù)庫(kù),狀態(tài)變?yōu)槲葱薷?,如此重?fù)。
檢查當(dāng)前文件狀態(tài)
要確定哪些文件當(dāng)前處于什么狀態(tài),可以用:
git status
如果是剛創(chuàng)建的倉(cāng)庫(kù),則會(huì)顯示
On branch master
nothing to commit, working directory clean
這說明現(xiàn)在的工作目錄是干凈的。所有已跟蹤文件在上次提交后都未被更改過。此外還表明當(dāng)前目錄下沒有任何處于未跟蹤的文件,否則 Git會(huì)在這里列出來。最后該命令還顯示了當(dāng)前所在的分支是 master,這是默認(rèn)的分支名稱。
現(xiàn)在在當(dāng)前目錄下創(chuàng)建一個(gè)新文件 README,保存退出后運(yùn)行
git status
會(huì)看到該文件出現(xiàn)在未跟蹤文件列表中:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
可以看到新建的README文件出現(xiàn)在“Untracked files”下面。用
git add README
命令將該文件加入跟蹤后再運(yùn)行
git status
會(huì)看到 README 文件已被跟蹤,并處于暫存狀態(tài)
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
加入我們對(duì)倉(cāng)庫(kù)中一個(gè)叫newText.text的文件進(jìn)行一些修改以后,再運(yùn)行
git status
會(huì)看到
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: newText.text
文件 newText.text 出現(xiàn)在 “Changes not staged for commit” 這行下面,說明已跟蹤文件的內(nèi)容發(fā)生了變化,但還沒有放到暫存區(qū)。要暫存這次更新,需要運(yùn)行 git add 命令(這是個(gè)多功能命令,根據(jù)目標(biāo)文件的狀態(tài)不同,此命令的效果也不同:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時(shí)把有沖突的文件標(biāo)記為已解決狀態(tài)等)?,F(xiàn)在讓我們運(yùn)行 git add 把newText.text 放到暫存區(qū),然后再看看 git status 的輸出
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: newText.text
可以看出兩個(gè)文件都已經(jīng)被放入了暫存區(qū),下次提交的時(shí)候會(huì)一起被寫入數(shù)據(jù)庫(kù)。
提交修改
在我們新增、修改文件后,使用
git commit -m [initial project version]
命令提交修改,initial project version是提交時(shí)的說明,在這里寫明做了什么修改,方便自己和別人過后查看代碼。
提交代碼之前必須先用add命令將修改后的文件加入暫存區(qū),如果想跳過這一步,也可以使用
git commit -am [initial project version]
或者
git commit -a -m [initial project version]
來直接提交改動(dòng),這樣會(huì)直接將已經(jīng)加入跟蹤的并且發(fā)生了改動(dòng)的文件先加入暫存區(qū)然后提交,省略了add步驟。
設(shè)置忽略目錄
有時(shí)會(huì)有些文件我們不希望納入Git的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表,比如日志文件、配置文件等。我們可以在倉(cāng)庫(kù)的根目錄下使用
touch .gitignore
創(chuàng)建一個(gè)名為 .gitignore的文件,然后使用
echo ["rule"]>>.gitignore
向.gitignore文件中寫入要忽略的文件的規(guī)則,其中rule是字符串例如:
echo *.[oa]>>.gitignore
表示忽略所有以 .o 或 .a 結(jié)尾的文件
echo *~>>.gitignore
表示忽略所有以波浪符(~)結(jié)尾的文件
新增了.gitignore文件后也需要進(jìn)行提交。
有些時(shí)候,你想添加一個(gè)文件到Git,但發(fā)現(xiàn)添加不了,原因可能是這個(gè)文件被.gitignore忽略了,如果你確實(shí)想添加該文件,可以用
git add -f [App.class]
強(qiáng)制添加App.class這個(gè)文件到Git,如果你想知道是哪一個(gè)規(guī)則限制了添加,可以使用
git check-ignore -v App.class
來檢查,git會(huì)輸出信息表明是第幾行規(guī)則忽略了該文件。
查看已暫存和未暫存的更新
git status的顯示的信息比較簡(jiǎn)單,僅僅是列出了修改過的文件,如果要查看具體修改了什么地方,可以用
git diff
來查看當(dāng)前工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容,注意git diff只是顯示還沒有暫存起來的改動(dòng),而不是這次工作和上次提交之間的差異。所以暫存了所有更新過的文件后,運(yùn)行 git diff 是什么都沒有的。
查看暫存區(qū)文件與上次提交后的變化,可以使用
git diff --cached
查看兩次commit之間的變化,可以使用
git diff [commit_id1] [commit_id2]
比較工作區(qū)與最新本地版本庫(kù),可以使用
git diff HEAD
比較工作區(qū)與指定commit-id的差異,可以使用
git diff [commit_id1]
撤銷操作
有時(shí)候我們提交完了才發(fā)現(xiàn)漏掉了幾個(gè)文件沒有加,或者提交信息寫錯(cuò)了。想要撤消剛才的提交操作,可以使用--amend選項(xiàng)重新提交,如果只是想提交修改信息,則只需要輸入
git commit --amend
輸入指令后將會(huì)彈出文本編輯器,可以看到上一次提交的說明,按shift + i組合鍵進(jìn)入編輯模式可以修改提交信息,修改完成后按esc退出編輯模式,再按shift + :組合鍵,輸入wq,回車保存改動(dòng),提交說明就會(huì)被修改。
如果不是只修改說明而是想要補(bǔ)上其他的改動(dòng),則可以將其他改動(dòng)先暫存,然后在提交的時(shí)候帶上--amend:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
這樣會(huì)將第二次提交和第一次提交合并,最終只產(chǎn)生一個(gè)提交。
如果我們將某個(gè)文件誤加入了暫存區(qū),可以使用
git reset HEAD <fileName>
將名為fileName的文件移出暫存區(qū),這個(gè)文件將會(huì)回到已修改未暫存的狀態(tài)。
如果我們想放棄改動(dòng)將某個(gè)文件返回修改前的狀態(tài),可以使用
git checkout -- <fileName>
將名為fileName的文件恢復(fù)成未修改的狀態(tài),這個(gè)操作將會(huì)清空所有已經(jīng)修改,需要謹(jǐn)慎操作。
在Git中所有已經(jīng)提交過的改動(dòng)都可以被恢復(fù),即便在已經(jīng)刪除的分支中的提交,或者用 --amend 重新改寫的提交,沒有提交過的的改動(dòng)無法恢復(fù),對(duì)Git 來說它們就像從未存在過一樣。
標(biāo)簽操作
Git可以對(duì)某一時(shí)間點(diǎn)上的版本打上標(biāo)簽,方便未來某個(gè)時(shí)間能回退到打標(biāo)簽時(shí)刻的狀態(tài)
要列出所有tag:
git tag
顯示的標(biāo)簽按字母順序排列,標(biāo)簽太多的時(shí)候我們可以用特定的搜索模式列出符合條件的標(biāo)簽
git tag -l 'v1.4.2.*'
只顯示v1.4.2系列版本
Git使用的標(biāo)簽有兩種類型:輕量級(jí)的(lightweight)和含附注的(annotated)。輕量級(jí)標(biāo)簽就像是個(gè)不會(huì)變化的分支,實(shí)際上它就是個(gè)指向特定提交對(duì)象的引用。而含附注標(biāo)簽,實(shí)際上是存儲(chǔ)在倉(cāng)庫(kù)中的一個(gè)獨(dú)立對(duì)象,它有自身的校驗(yàn)和信息,包含著標(biāo)簽的名字,電子郵件地址和日期,以及標(biāo)簽說明,在這里只舉例輕量級(jí)標(biāo)簽的使用方法:
git tag v1.4
則打上了V1.4的標(biāo)簽
Git分支操作
創(chuàng)建切換新分支
git branch testing
可以新建一個(gè)名為testing的新分支,但是不會(huì)自動(dòng)切換到該分支,要切換到該分支:
git checkout testing
也可以使用
git branch -b testing
一步完成創(chuàng)建和切換工作。
在切換分支的時(shí)候,如果暫存區(qū)或者工作目錄里還沒有提交的修改和你即將檢出的分支會(huì)產(chǎn)生沖突,Git會(huì)阻止你切換分支,此時(shí)可以使用
git stash
將這些內(nèi)容暫存起來,切換分支或者當(dāng)再回到這個(gè)分支后,使用
git stash pop
方法就會(huì)將這些內(nèi)容取出到當(dāng)前分支。
刪除分支
如果需要?jiǎng)h除的分支不是當(dāng)前正在打開的分支,使用branch -d直接刪除
git branch -d <branchName>
如果我們?cè)谠噲D刪除一個(gè)分支時(shí)自己還沒轉(zhuǎn)移到另外的分支上,Git就會(huì)給出一個(gè)警告,并拒絕該刪除操作。如果堅(jiān)持要?jiǎng)h除該分支的話,就需要在命令中使用-D選項(xiàng)
git branch -D <branchName>
當(dāng)我們刪除一個(gè)分支時(shí),Git只是刪除了指向相關(guān)提交的指針,但該提交對(duì)象依然會(huì)留在版本庫(kù)中,如果我們知道這個(gè)分支的Hash值,那么我們可以使用
git branch <branchName> <hashValue>
來恢復(fù)這個(gè)分支,如果不知道這個(gè)分支的Hash值,可以使用
git reflog
來查看所有所有的commit信息,包括所有branch的commit,甚至包括已經(jīng)撤銷的commit
分支的合并
git checkout master
git merge fixIssue
可以將fixIssue分支合并回master分支
關(guān)于分支的合并,需要注意的是,如果從master分支分離出來的分支fixIssue過后又合并進(jìn)了master分支,如果此時(shí)master分支上沒有其他新增的內(nèi)容的話,合并成功后會(huì)出現(xiàn)Fast-forward的提示,表明實(shí)際上是將master的指針快進(jìn)到了fixIssue的指針處,如果此時(shí)master分支上已經(jīng)有了其他的改動(dòng),則Git會(huì)自動(dòng)生成一個(gè)新的合并提交并將master的指針指向這個(gè)提交
處理沖突
如果在不同的分支中都修改了同一個(gè)文件的同一部分則在合并時(shí)會(huì)產(chǎn)生沖突,提示如下:
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
此時(shí)Git已經(jīng)做了合并,但是沒有提交,此時(shí)可以用git status來查看哪些文件產(chǎn)生了沖突:
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
包含沒有解決的沖突的文件都會(huì)被標(biāo)記為unmerged狀態(tài),從上面的結(jié)果可以看出index.html這個(gè)文件產(chǎn)生了沖突,用文本編輯器打開這個(gè)文件,會(huì)出現(xiàn)以下的內(nèi)容:
<<<<<<< HEAD
var a = 1
=======
var a = 2
>>>>>>> fixIssue
Git使用=======符合將有沖突的部分分隔開
<<<<<<< HEAD
var a = 1
=======
表示當(dāng)前分支的內(nèi)容
=======
var a = 2
>>>>>>> fixIssue
表示合并進(jìn)來的分支的內(nèi)容,選擇要保留的部分,將<<<<<<< HEAD、=======和>>>>>>> fixIssue標(biāo)記刪除,再用git add命令將修改好的文件標(biāo)記為沖突已解決并加入暫存區(qū),然后使用git commit提交。
在我們的日常開發(fā)中,使用pull request流程來提交代碼,如果提交pr的時(shí)候提示有沖突,例如想將fixIssue分支合回master,最好在本地將master分支合并進(jìn)fixIssue,在fixIssue中解決好沖突后,此時(shí)pr應(yīng)該就會(huì)顯示沖突已經(jīng)解決可以自動(dòng)合并,不要在master分支上合并沖突防止出現(xiàn)誤操作破壞master分支。
管理分支
git branch命令除了能創(chuàng)建刪除分支,也可以查看分支的信息,直接使用
git branch
會(huì)列出所有的分支清單:
iss53
* master
testing
帶*號(hào)的是當(dāng)前選中的分支,也可以使用
git branch -v
來查看每個(gè)分支最后一次提交的信息
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes
還可以使用
git branch --merged
來查看哪些分支已經(jīng)合并回了當(dāng)前分支
iss53
* master
結(jié)果顯示iss53這個(gè)分支已經(jīng)合并回了master分支,如果不是有特殊用途要保留一般可以刪除,因?yàn)檫@個(gè)分支的改動(dòng)已經(jīng)包含在master分支中,使用
git branch --no-merged
可以查看哪些分支還沒有合并進(jìn)當(dāng)前分支
遠(yuǎn)程倉(cāng)庫(kù)的使用
遠(yuǎn)程分支的概念
遠(yuǎn)程分支是本地分支在Git服務(wù)器上的對(duì)應(yīng),一般我們都是使用GitHub的Git服務(wù)器服務(wù),假如我們?cè)贕itHub上有一個(gè)倉(cāng)庫(kù),當(dāng)我們使用第一節(jié)提到的git clone將這個(gè)倉(cāng)庫(kù)克隆到本地的話,將會(huì)在本地復(fù)制一個(gè)與遠(yuǎn)程倉(cāng)庫(kù)一樣的本地倉(cāng)庫(kù),并給遠(yuǎn)程倉(cāng)庫(kù)起一個(gè)默認(rèn)名字origin,假如遠(yuǎn)程倉(cāng)庫(kù)的默認(rèn)分支叫master的話,將會(huì)在本地創(chuàng)建一個(gè)命名為origin/master分支,但你無法在本地更改其數(shù)據(jù),接著Git 建立一個(gè)屬于你自己的本地master分支,和origin上的master分支指向相同的位置
你不能直接修改origin/master分支的數(shù)據(jù),但是你可以通過修改本地master分支的數(shù)據(jù),然后推送到遠(yuǎn)程倉(cāng)庫(kù)的方式來改變origin/master分支的數(shù)據(jù),或者通過拉取操作來把本地master分支的數(shù)據(jù)更新到和origin/master一樣
假如你在本地master分支做了些改動(dòng),與此同時(shí)其他人向origin/master推送了他們的更新,那么服務(wù)器上的master分支就會(huì)向前推進(jìn),而與此同時(shí),你在本地的提交歷史正朝向不同方向發(fā)展。不過只要你不和服務(wù)器通訊,你的origin/master 指針仍然保持原位不會(huì)移動(dòng)
推送數(shù)據(jù)到遠(yuǎn)程分支
使用
git push origin serverfix
可以將本地的serverfix分支推送到遠(yuǎn)程倉(cāng)庫(kù)的serverfix分支上,這里是簡(jiǎn)便寫法,Git會(huì)自動(dòng)將serverfix擴(kuò)展為refs/heads/serverfix:refs/heads/serverfix,意思是“取出我在本地的serverfix分支,推送到遠(yuǎn)程倉(cāng)庫(kù)的serverfix分支中去,也可以使用
git push origin serverfix:serverfix
來達(dá)到相同效果,如果想讓遠(yuǎn)程分支和本地分支使用不同的名字,可以用
git push origin localBranchName:originBranchName
來將本地叫l(wèi)ocalBranchName的分支推送到遠(yuǎn)程倉(cāng)庫(kù),在遠(yuǎn)程倉(cāng)庫(kù)上的分支名字叫originBranchName
當(dāng)你運(yùn)行
git fetch origin
時(shí),會(huì)同步遠(yuǎn)程服務(wù)器上的數(shù)據(jù)到本地。該命令首先找到 origin 是哪個(gè)服務(wù)器,然后從上面獲取你尚未擁有的數(shù)據(jù),更新你本地的數(shù)據(jù)庫(kù),然后把 origin/serverfix 的指針移到它最新的位置上
需要注意的是,在 fetch操作下載好新的遠(yuǎn)程分支之后,本地的serverfix分支并沒有更新,本地只是多了一個(gè)不能操作的origin/serverfix 分支,必須要在本地的serverfix分支使用
git merge origin/serverfix
命令將遠(yuǎn)程分支的變化合并回本地分支
跟蹤遠(yuǎn)程分支
假如遠(yuǎn)程分支不是自己創(chuàng)建的,則需要跟蹤遠(yuǎn)程分支,假如其他人推送了一個(gè)新分支newBranch到遠(yuǎn)程倉(cāng)庫(kù),則在調(diào)用git fetch origin時(shí)本地會(huì)出現(xiàn)一個(gè)origin/newBranch分支,使用
git checkout -b newBranch origin/newBranch
則本地會(huì)多一個(gè)newBranch分支,此時(shí)的分支叫跟蹤分支,在跟蹤分支里輸入
git push
Git會(huì)自行推斷應(yīng)該向哪個(gè)服務(wù)器的哪個(gè)分支推送數(shù)據(jù),在這些分支里運(yùn)行
git pull
會(huì)獲取所有遠(yuǎn)程索引,并把它們的數(shù)據(jù)都合并到本地分支中來,git pull相當(dāng)于git fetch和git merge的組合,在克隆倉(cāng)庫(kù)時(shí),Git通常會(huì)自動(dòng)創(chuàng)建一個(gè)名為master的分支來跟蹤 origin/master。這正是git push和git pull一開始就能正常工作的原因,跟蹤分支可以和遠(yuǎn)程分支不同名:
git checkout -b anotherBranch origin/newBranch
刪除遠(yuǎn)程分支
刪除遠(yuǎn)程分支的命令是:
git push origin :serverfix
和推送遠(yuǎn)程分支的區(qū)別就是本地分支的名字為空
Git進(jìn)階用法
變基操作
如果有一個(gè)分支master,上面有兩個(gè)提交A、B,此時(shí)開了一個(gè)新分支new,然后在new分支上提交了一系列提交,此時(shí)master也有了新提交,此時(shí)分支的情況如下圖所示:
C new
/
A---B---D master
此時(shí)如果我們將new分支合回master分支,此時(shí)會(huì)在master分支上進(jìn)行一次三方合并,生成一個(gè)新的提交D',現(xiàn)在分支的情況如下:
C new
/ \
A---B---D--- D' master
除了merge外,還有另一種整合兩個(gè)分支的方法,就是rebase方法,回到合并new到master之前,假如在new分支上執(zhí)行:
git rebase master
則分支的情況如下:
C---D’ new
/
A---B---D master
對(duì)master分支進(jìn)行一次快進(jìn)合并,現(xiàn)在的情況如下:
C---D’ new
/ master
A---B---D
此時(shí)相當(dāng)于new分支是在D提交之后才開出來的分支,然后再提交了C提交,然后再做了一個(gè)補(bǔ)丁操作,再把master的指針移動(dòng)到new分支指針的位置。使用rebase指令后,master和直接merge在內(nèi)容上沒有區(qū)別。
使用變基操作一般是想要得到一個(gè)能在遠(yuǎn)程分支上干凈應(yīng)用的補(bǔ)丁,比如某些項(xiàng)目你不是維護(hù)者,但想幫點(diǎn)忙的話,最好用變基:先在自己的一個(gè)分支里進(jìn)行開發(fā),當(dāng)準(zhǔn)備向主項(xiàng)目提交補(bǔ)丁的時(shí)候,根據(jù)最新的 origin/master進(jìn)行一次變基操作然后再提交,這樣維護(hù)者就不需要做任何整合工作,只需根據(jù)你提供的倉(cāng)庫(kù)地址作一次快進(jìn)合并,或者直接采納你提交的補(bǔ)丁。實(shí)際上是把解決分支補(bǔ)丁同最新主干代碼之間沖突的責(zé)任,化轉(zhuǎn)為由提交補(bǔ)丁的人來解決。
變基操作除了可以在分叉的兩個(gè)分支上進(jìn)行,也可以將分支上的分支rebase到主分支上,假如目前的分支情況如下:
E---F anotherBranch
/
C---D oneBranch
/
A---B master
使用
git rebase --onto master oneBranch anotherBranch
此時(shí)的分支狀況會(huì)變成
C---D oneBranch
/
A---B--C'--D'--E'--F' anotherBranch
|
master
變基操作雖然有用,但是最好是在還未同步到遠(yuǎn)程分支的本地分支上使用,不要在遠(yuǎn)程分支上使用。
變基操作的其他用途
當(dāng)我們有了數(shù)個(gè)提交之后,突然發(fā)現(xiàn)其中的某一個(gè)提交是錯(cuò)的不想要了,或者想改變一下提交的順序的時(shí)候,可以使用
git rebase -i [commitID]
-i 的意思是interactive,交互式操作的意思,例如當(dāng)我們輸入
git rebase -i HEAD~3
后,會(huì)出現(xiàn)如下的提示:
pick c24b68f3 刪除節(jié)點(diǎn)崩潰
pick c1049e31 修改issue1087
pick b57a1f89 修改首頁(yè)點(diǎn)擊router圖標(biāo)數(shù)據(jù)錯(cuò)誤issue
# Rebase 7a173fb4..b57a1f89 onto 7a173fb4 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
~
"~/Documents/mercku_ios/.git/rebase-merge/git-rebase-todo" 22L, 767C
這表明從當(dāng)前指針往前數(shù)的三個(gè)提交被重新拿了出來,有機(jī)會(huì)能再次提交,注釋中給出了提示pick代表使用本次提交,reword表示使用這次提交但是改變提交信息,sqush表示將這次提交與上次提交合并,并能改變提交信息,drop表示丟棄這次提交。
按command加i組合鍵進(jìn)入編輯模式,可以修改關(guān)鍵字,修改完成以后按esc退出編輯模式,再按command加:,輸入wq保存退出即可生效。
變基操作的其他用途
在利用github實(shí)現(xiàn)多人合作程序開發(fā)的過程中,我們有時(shí)會(huì)出現(xiàn)錯(cuò)誤提交的情況,此時(shí)我們希望能撤銷提交操作,讓程序回到提交前的樣子,總結(jié)了兩種解決方法:回退(reset)、反做(revert)。
- 查看版本號(hào):
git log
- 本地版本回退:
git reset --hard [commit id]
- 強(qiáng)制更新遠(yuǎn)程
git push -f