Git簡介
Git是Linux之父Linus的第二個(gè)偉大的作品垛耳,它最早是在Linux上開發(fā)的,被用來管理Linux核心的源代碼。后來慢慢地有人將其移植到了Unix堂鲜、Windows栈雳、Max OS等操作系統(tǒng)中。
Git是一個(gè)分布式的版本控制系統(tǒng)缔莲,與集中式的版本控制系統(tǒng)不同的是哥纫,每個(gè)人都工作在通過克隆建立的本地版本庫中。也就是說每個(gè)人都擁有一個(gè)完整的版本庫痴奏,查看提交日志蛀骇、提交、創(chuàng)建里程碑和分支读拆、合并分支擅憔、回退等所有操作都直接在本地完成而不需要網(wǎng)絡(luò)連接。
對(duì)于Git倉庫來說檐晕,每個(gè)人都有一個(gè)獨(dú)立完整的倉庫暑诸,所謂的遠(yuǎn)程倉庫或是服務(wù)器倉庫其實(shí)也是一個(gè)倉庫,只不過這臺(tái)主機(jī)24小時(shí)運(yùn)行辟灰,它是一個(gè)穩(wěn)定的倉庫个榕,供他人克隆、推送芥喇,也從服務(wù)器倉庫中拉取別人的提交西采。
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng),沒有之一继控,對(duì)械馆,沒有之一!
三個(gè)區(qū)
工作區(qū)(working diretory) 用于修改文件
緩存區(qū)(stage) 是用來暫時(shí)存放工作區(qū)中修改的內(nèi)容
提交歷史(commit history) 提交代碼的歷史記錄
主要的幾個(gè)命令
git add # 將工作區(qū)的修改提交到暫存區(qū)
git commit # 將暫存區(qū)的修改提交到當(dāng)前分支
git reset # 回退到某一個(gè)版本
git stash # 保存某次修改
git pull # 從遠(yuǎn)程更新代碼
git push # 將本地代碼更新到遠(yuǎn)程分支上
git reflog # 查看歷史命令
git status # 查看當(dāng)前倉庫的狀態(tài)
git diff # 查看修改
git log # 查看提交歷史
git revert # 回退某個(gè)修改
git commit用法
git commit –m “本次提交描述”
該命令會(huì)將git add .存入暫存區(qū)修改內(nèi)容提交至本地倉庫中,若文件未添加至?xí)捍鎱^(qū)湿诊,則提交時(shí)不會(huì)提交任何修改。
git commit -a
相當(dāng)于運(yùn)行 git add -u把所有當(dāng)前目錄下的文件加入緩存區(qū)域再運(yùn)行g(shù)it commit.
注意瘦材!對(duì)于新增的文件厅须,并沒有被commit
git commit –am “本次提交描述”
或者git commit –a –m“本次提交描述”
等同于上面的-a和-m
git commit --amend
修改最近一次提交。有時(shí)候如果提交注釋書寫有誤或者漏提文件食棕,可以使用此命令朗和。對(duì)于漏提交的文件,需要git add到緩存區(qū)之后簿晓,git commit --amend才能將修改追加到最近的一次提交上眶拉。
git stash用法
$ git stash
所有未提交的修改都保存起來,用于后續(xù)恢復(fù)當(dāng)前工作目錄
$ git stash save "stash_name"
給每個(gè)stash加一個(gè)message憔儿,用于記錄版本
$ git stash pop / git stash apply
恢復(fù)最新緩存的工作目錄(第一個(gè))忆植,并刪除緩存堆棧中的那一個(gè)stash刪除(pop), apply則只恢復(fù)不刪除
$ git stash list
查看現(xiàn)有所有stash
在使用git stash pop(apply)命令時(shí)可以通過名字指定使用哪個(gè)stash,默認(rèn)使用最近的stash(即stash@{0})
$ git stash drop
移除最新的stash,后面也可以跟指定stash的名字
git reset用法
git reset根據(jù)–soft –mixed –hard朝刊,會(huì)對(duì)working tree和index和HEAD進(jìn)行重置
$ git reset HEAD^
回退版本耀里,一個(gè)^表示一個(gè)版本,可以多個(gè)拾氓,另外也可以使用 git reset HEAD~n這種形式冯挎。
也可以回退到指定版本:
$ git reset commit-id
soft 參數(shù):git reset --soft HEAD~1 意為將版本庫軟回退1個(gè)版本,所謂軟回退表示將本地版本庫的頭指針全部重置到指定版本咙鞍,且將這次提交之后的所有變更都移動(dòng)到暫存區(qū)
默認(rèn)的mixed參數(shù):git reset HEAD~1 意為將版本庫回退1個(gè)版本房官,將本地版本庫的頭指針全部重置到指定版本,且會(huì)重置暫存區(qū)续滋,即這次提交之后的所有變更都移動(dòng)到工作區(qū)
hard參數(shù):git reset --hard HEAD~1 意為將版本庫回退1個(gè)版本翰守,但是不僅僅是將本地版本庫的頭指針全部重置到指定版本,也會(huì)重置暫存區(qū)吃粒,并且會(huì)將工作區(qū)代碼清空(工作區(qū)是clean狀態(tài))
注意潦俺,soft參數(shù)與默認(rèn)參數(shù)都不會(huì)修改工作區(qū)代碼,只有hard參數(shù)才會(huì)修改工作區(qū)代碼徐勃。
另外事示,git reset HEAD filename
回退文件,將文件從暫存區(qū)回退到工作區(qū)(unstage)僻肖,此時(shí)不能帶hard,soft參數(shù)
git reflog
如果在回退以后又想再次回到之前的版本肖爵,git reflog 可以查看所有分支的所有操作記錄(包括commit和reset的操作),包括已經(jīng)被刪除的commit記錄臀脏,git log則不能察看已經(jīng)刪除了的commit記錄
615ce06 HEAD@{44}: rebase -i (finish): returning to refs/heads/my_test_branch
615ce06 HEAD@{45}: rebase -i (fixup): zancun_new
702356c HEAD@{46}: rebase -i (fixup): # This is a combination of 2 commits.
c997622 HEAD@{47}: rebase -i (reword): zancun_new
fb74ec2 (origin/master, origin/HEAD) HEAD@{48}: rebase -i (start): checkout FETCH_HEAD
f3ef592 HEAD@{49}: commit: zancun3
6b82c75 HEAD@{50}: commit: zancun2
e900fa0 HEAD@{51}: commit: zancun
比如說劝堪,回退到commit: zancun3,只需要:
git reset --hard f3ef592 (或者HEAD@{49}) 即可
這個(gè)命令對(duì)于找回丟失的代碼非常有用揉稚。
git add
刪除文件后需要 git add -A, 光 git add. 不行秒啦,區(qū)別如下:
git add -A 保存所有的修改
git add . 保存新的添加和修改,但是不包括刪除
git add -u 保存修改和刪除搀玖,但是不包括新建文件余境。
所以默認(rèn)使用git add -A就行
git checkout
git checkout既可以操作分支,也可以操作文件
git checkout切換分支
$ git checkout -b newBranchName
Switched to a new branch 'newBranchName'
這相當(dāng)于執(zhí)行下面這兩條命令:
git branch newBranchName
git checkout newBranchName(工作區(qū)一定要是clean的)
$ git checkout -b newBranchName remote_branch_name
拉取遠(yuǎn)程分支remote_branch_name創(chuàng)建一個(gè)本地分支newBranchName灌诅,并切到本地分支newBranchName芳来,采用此種方法建立的本地分支會(huì)和遠(yuǎn)程分支建立映射關(guān)系。
git checkout 回退修改
git checkout -- fileName
這條命令把fileName從當(dāng)前HEAD中檢出猜拾,也就是回退當(dāng)前工作區(qū)的這個(gè)文件的修改
--可以省略不寫
如果需要回退工作區(qū)的全部文件修改即舌,可以使用:
git checkout --hard HEAD
而不需要對(duì)每個(gè)文件進(jìn)行checkout,這樣太累
git revert
git revert,反轉(zhuǎn)提交, 撤銷一個(gè)提交的同時(shí)會(huì)創(chuàng)建一個(gè)新的提交挎袜,也就是用一個(gè)新提交來消除一個(gè)歷史提交所做的任何修改.
git revert commit-id revert指定的一個(gè)commit
git revert HEAD~3 revert指定倒數(shù)第四個(gè)commit
revert過程有可能遇到?jīng)_突顽聂,要么git revert --abort終止此次revert操作肥惭,代碼還原至revert命令前。要么手動(dòng)消除沖突(同普通的沖突解決)芜飘,然后add commit
reset,checkout,revert總結(jié)
下面這個(gè)表格總結(jié)了這些命令最常用的使用場景务豺。記得經(jīng)常對(duì)照這個(gè)表格,因?yàn)槟闶褂肎it時(shí)一定會(huì)經(jīng)常用到嗦明。
命令 | 作用域 | 常用情景
---- | ---
git reset | 提交層面 | 在私有分支上舍棄一些沒有提交的更改
git reset| 文件層面 | 將文件從緩存區(qū)中移除
git checkout| 提交層面| 切換分支或查看舊版本
git checkout| 文件層面| 舍棄工作目錄中的更改
git revert| 提交層面| 在公共分支上回滾更改
git revert| 文件層面| (然而并沒有)
刪除分支
刪除分支: $ git branch -d branchName
或者笼沥, git branch -D branchName 刪除分支(不管它有沒有merge)
前提是先要切換到其他分支
$ git branch -d branch1
error: The branch 'branch1' is not fully merged.
If you are sure you want to delete it, run 'git branch -D branch1'.
git push
git push命令用于將本地分支的更新,推送到遠(yuǎn)程主機(jī)娶牌。
$ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
$ git push origin master
上面命令表示奔浅,將本地的master分支推送到origin主機(jī)的master分支。如果master不存在诗良,則會(huì)被新建汹桦。
如果省略本地分支名,則表示刪除指定的遠(yuǎn)程分支鉴裹,因?yàn)檫@等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支舞骆。
$ git push origin :master
# 等同于
$ git push origin --delete master
上面命令表示刪除origin主機(jī)的master分支。如果當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系径荔,則本地分支和遠(yuǎn)程分支都可以省略督禽。
$ git push origin
上面命令表示,將當(dāng)前分支推送到origin主機(jī)的對(duì)應(yīng)分支总处。如果當(dāng)前分支只有一個(gè)追蹤分支狈惫,那么主機(jī)名都可以省略。
$ git push
如果當(dāng)前分支與多個(gè)主機(jī)存在追蹤關(guān)系鹦马,則可以使用-u選項(xiàng)指定一個(gè)默認(rèn)主機(jī)胧谈,這樣后面就可以不加任何參數(shù)使用git push
$ git push -u origin master
上面命令將本地的master分支推送到origin主機(jī),同時(shí)指定origin為默認(rèn)主機(jī)荸频,后面就可以不加任何參數(shù)使用git push了菱肖。
將當(dāng)前分支推送到遠(yuǎn)程的同名的簡單方法,如下:
$ git push origin HEAD
將當(dāng)前分支推送到源存儲(chǔ)庫中的遠(yuǎn)程引用匹配主機(jī)旭从。 這種形式方便推送當(dāng)前分支稳强,而不考慮其本地名稱。如下:
$ git push origin HEAD:master
單獨(dú)使用git push時(shí)遇绞,沒有指定push的remote分支名键袱,假如當(dāng)前本地分支名稱與其對(duì)應(yīng)的remote分支名稱不一樣燎窘,則會(huì)有一下提示:
fatal: The upstream branch of your current branch does not match
the name of your current branch. To push to the upstream branch
on the remote, use
git push origin HEAD:my_new_test_branch
To push to the branch of the same name on the remote, use
git push origin test
To choose either option permanently, see push.default in 'git help config'.
當(dāng)執(zhí)行g(shù)it push origin test時(shí)摹闽,會(huì)在遠(yuǎn)程重新創(chuàng)建一個(gè)新的分支,名稱就是test褐健,然后把修改同步到test分支付鹿。
git pull
git pull命令用于從另一個(gè)存儲(chǔ)庫或本地分支獲取并集成(整合)澜汤。git pull命令的作用是:取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并舵匾,
$ git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
比如俊抵,要取回origin主機(jī)的master分支,與本地的test分支合并坐梯,需要寫成下面這樣
$ git pull origin master:test
如果遠(yuǎn)程分支(master)要與當(dāng)前分支合并徽诲,則冒號(hào)后面的部分可以省略。上面命令可以簡寫:
$ git pull origin master
將遠(yuǎn)程存儲(chǔ)庫中的更改合并到當(dāng)前分支中吵血。在默認(rèn)模式下谎替,git pull是git fetch后跟git merge FETCH_HEAD的縮寫。
更準(zhǔn)確地說蹋辅,git pull使用給定的參數(shù)運(yùn)行g(shù)it fetch钱贯,并調(diào)用git merge將檢索到的分支頭合并到當(dāng)前分支中。 使用--rebase侦另,它運(yùn)行g(shù)it rebase而不是git merge秩命。也就是說
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
git中都fetch命令是將遠(yuǎn)程分支的最新內(nèi)容拉到了本地,但是fetch后是看不到變化的褒傅,此時(shí)本地多了一個(gè)FETCH_HEAD的指針弃锐,checkout到該指針后可以查看遠(yuǎn)程分支的最新內(nèi)容。然后checkout到master分支樊卓,執(zhí)行metch,選中FETCH_HEAD指針,合并后如果出現(xiàn)沖突則解決沖突拿愧,最后commit。
pull的作用就相當(dāng)于fetch和merge碌尔,自動(dòng)合并
git fetch origin master
git merge FETCH_HEAD
git fetch origin isoda-android_1.3.0_feature :branch1
使用遠(yuǎn)程isoda-android_1.3.0_feature分支在本地創(chuàng)建branch1分支(但不會(huì)切換到該分支)
1. git merge
將 origin 分支合并到 mywork 分支最簡單的辦法就是用下面這些命令
git checkout mywork
git merge origin
或者浇辜,你也可以把它們壓縮在一行里:
git merge origin mywork
假設(shè)遠(yuǎn)程分支上有3次提交A,B,C:
在遠(yuǎn)程分支origin的基礎(chǔ)上創(chuàng)建一個(gè)名為"mywork"的本地分支并提交了修改E,同時(shí)有其他人在"origin"上做了一些修改并提交了修改D唾戚。
用git merge命令把"origin"分支與本地提交合并(merge)成版本M柳洋,mywork 分支中新的合并提交(merge-commit)將兩個(gè)分支的歷史連在了一起,但這樣會(huì)形成圖中的菱形叹坦,讓人很困惑熊镣。
Merge 好在它是一個(gè)安全的操作,比較安全募书,現(xiàn)有的分支不會(huì)被更改绪囱,避免了 rebase 潛在的缺點(diǎn)(后面會(huì)說)。另一方面莹捡,這同樣意味著每次合并上游更改時(shí) feature 分支都會(huì)引入一個(gè)外來的合并提交鬼吵。如果 master非常活躍的話篮赢,這或多或少會(huì)污染你的分支歷史齿椅。雖然高級(jí)的 git log 選項(xiàng)可以減輕這個(gè)問題琉挖,但對(duì)于開發(fā)者來說,還是會(huì)增加理解項(xiàng)目歷史的難度涣脚。
2. git rebase
作為 merge 的替代選擇示辈,你可以像下面這樣將 mywork 分支并入 origin 分支:
git checkout mywork
git rebase origin
它會(huì)把整個(gè) mywork 分支移動(dòng)到 origin 分支的后面,有效地把所有 master 分支上新的提交并入過來遣蚀。但是矾麻,rebase為原分支上每一個(gè)提交創(chuàng)建一個(gè)新的提交,重寫了項(xiàng)目歷史芭梯,并且不會(huì)帶來合并提交射富。rebase的好處是避免了菱形的產(chǎn)生,保持提交曲線為直線粥帚,讓大家易于理解胰耗。
rebase最大的好處是你的項(xiàng)目歷史會(huì)非常整潔。首先芒涡,它不像 git merge 那樣引入不必要的合并提交柴灯。其次,如上圖所示费尽,rebase 導(dǎo)致最后的項(xiàng)目歷史呈現(xiàn)出完美的線性——你可以從項(xiàng)目終點(diǎn)到起點(diǎn)瀏覽而不需要任何的 fork赠群。這讓你更容易使用 git log、git reset 和 gitk 來查看項(xiàng)目歷史旱幼。
不過查描,這種簡單的提交歷史會(huì)帶來兩個(gè)后果:安全性和可跟蹤性。如果你違反了 rebase 黃金法則柏卤,重寫項(xiàng)目歷史可能會(huì)給你的協(xié)作工作流帶來災(zāi)難性的影響冬三。此外,rebase 不會(huì)有合并提交中附帶的信息——你看不到 mywork 分支中并入了上游的哪些更改缘缚。
在rebase的過程中勾笆,有時(shí)也會(huì)有conflict,這時(shí)Git會(huì)停止rebase并讓用戶去解決沖突桥滨,解決完沖突后窝爪,用git add命令去更新這些內(nèi)容,然后不用執(zhí)行g(shù)it commit,直接執(zhí)行g(shù)it rebase --continue,這樣git會(huì)繼續(xù)apply余下的補(bǔ)丁齐媒。
在任何時(shí)候蒲每,都可以用git rebase --abort參數(shù)來終止rebase的行動(dòng),并且mywork分支會(huì)回到rebase開始前的狀態(tài)喻括。
官方的兩張merge和rebase對(duì)比圖:
merge示例圖:
rebase示例圖:
3. rebase的高級(jí)操作--交互式rebase
交互式的 rebase 允許你更改并入新分支的提交邀杏。這比自動(dòng)的 rebase 更加強(qiáng)大,因?yàn)樗峁┝藢?duì)分支上提交歷史完整的控制双妨。一般來說淮阐,這被用于將 feature 分支并入 master 分支之前,清理混亂的歷史刁品。
把 -i 傳入 git rebase 選項(xiàng)來開始一個(gè)交互式的rebase過程:
git checkout feature
git rebase -i master
它會(huì)打開一個(gè)文本編輯器泣特,顯示所有將被移動(dòng)的提交:
pick e900fa0 zancun
pick 6b82c75 zancun2
pick f3ef592 zancun3
# Rebase fb74ec2..f3ef592 onto fb74ec2 (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
這個(gè)列表定義了 rebase 將被執(zhí)行后分支會(huì)是什么樣的。更改 pick 命令或者重新排序挑随,這個(gè)分支的歷史就能如你所愿了状您。比如說,如果第二個(gè)和第三個(gè)提交只是修復(fù)了第一個(gè)提交中的小問題兜挨,你可以用 fixup 命令把它們合到第一個(gè)提交中膏孟,并修改第一個(gè)的日志:
r e900fa0 zancun
f 6b82c75 zancun2
f f3ef592 zancun3
這樣三個(gè)提交合并成了一個(gè)提交,并可以重新修改提交日志拌汇,非常實(shí)用柒桑。
忽略不重要的提交會(huì)讓你的 feature 分支的歷史更清晰易讀。這是 git merge 做不到的噪舀。
4. Rebase的黃金法則
當(dāng)你理解rebase是什么的時(shí)候魁淳,最重要的就是什么時(shí)候不能用rebase。git rebase 的黃金法則便是与倡,絕不要在公共的分支上使用它界逛。
比如說,如果你把 master分支rebase到你的feature 分支上會(huì)發(fā)生什么:
這次 rebase 將 master 分支上的所有提交都移到了 feature 分支后面纺座。問題是它只發(fā)生在你的代碼倉庫中息拜,其他所有的開發(fā)者還在原來的 master 上工作。因?yàn)?rebase 引起了新的提交净响,Git 會(huì)認(rèn)為你的 master 分支和其他人的 master 已經(jīng)分叉了少欺。
同步兩個(gè) master 分支的唯一辦法是把它們 merge 到一起,導(dǎo)致一個(gè)額外的合并提交和兩堆包含同樣更改的提交馋贤。不用說狈茉,這會(huì)讓人非常困惑。
所以掸掸,在你運(yùn)行 git rebase 之前氯庆,一定要問問你自己「有沒有別人正在這個(gè)分支上工作?」扰付。如果答案是肯定的堤撵,那么把你的爪子放回去,重新找到一個(gè)無害的方式(如 git merge)來提交你的更改羽莺。不然的話实昨,你可以隨心所欲地重寫歷史。
5. rebae的本地清理功能
在你工作流中使用 rebase 最好的用法之一就是清理本地正在開發(fā)的分支盐固。隔一段時(shí)間執(zhí)行一次交互式 rebase荒给,你可以保證你 feature 分支中的每一個(gè)提交都是專注和有意義的丈挟。
調(diào)用 git rebase 的時(shí)候,你有兩個(gè)基(base)可以選擇:上游分支(比如 master)或者你 feature 分支中早先的一個(gè)提交志电。我們?cè)凇附换ナ?rebase」一節(jié)看到了第一種的例子曙咽。后一種在當(dāng)你只需要修改最新幾次提交時(shí)也很有用。比如說挑辆,下面的命令對(duì)最新的 3 次提交進(jìn)行了交互式 rebase:
git checkout feature
git rebase -i HEAD~3(或者第四個(gè)commit-id)
這樣例朱,就可以對(duì)本地提交歷史中最新的三個(gè)提交進(jìn)行重新整理了,包括提交合并鱼蝉,提交日志修改等等洒嗤。
通過指定 HEAD~3 作為新的基提交,你實(shí)際上沒有移動(dòng)分支——你只是將之后的 3 次提交重寫了魁亦。注意它不會(huì)把上游分支(master)的更改并入到 feature 分支中渔隶。
交互式 rebase 是在你工作流中引入 git rebase 的的好辦法,因?yàn)樗挥绊懕镜胤种Ы嗄巍F渌_發(fā)者只能看到你已經(jīng)完成的結(jié)果派撕,那就是一個(gè)非常整潔、易于追蹤的分支歷史睬魂。
追蹤關(guān)系
建立test倉庫 并建立追蹤關(guān)系
$ git branck --track test origin/master
修改追蹤關(guān)系
先切換到test
$ git checkout test
修改追蹤倉庫(一定要先切換)
$ git branch --set-upstream-to origin/master
建立追蹤關(guān)系之后终吼,本地分支名稱和遠(yuǎn)程一樣時(shí),使用git push時(shí)不用帶上遠(yuǎn)程名稱氯哮,git pull也不用帶上遠(yuǎn)程分支名
git沖突的修復(fù)
1. 直接編輯沖突文件
使用git pull --rebase經(jīng)常會(huì)出現(xiàn)沖突
沖突產(chǎn)生后际跪,文件系統(tǒng)中沖突了的文件里面的內(nèi)容會(huì)顯示為類似下面這樣:
<<<<<<< HEAD
* test2
* test3
=======
* this is my modify, my be conflicked
* test1000
>>>>>>> my_modify
其中:<<<<<<<(7個(gè)<)HEAD與=======之間的內(nèi)容是remote上的修改,沖突標(biāo)記=======與>>>>>>>之間的內(nèi)容是我的修改內(nèi)容喉钢。
在這兩者之間選擇任何你需要的內(nèi)容保留下來姆打,并刪除所有的===,<<<,>>>即可解決沖突,解決完成之后肠虽,git add -A, git rebase --continue就提交了代碼
2. 利用圖形界面工具解決沖突
當(dāng)然我們也可以利用圖形工具解決沖突
如果要解決的沖突很多幔戏,且比較復(fù)雜,圖形界面的沖突解決工具就顯得很重要了税课。
執(zhí)行g(shù)it mergetool用預(yù)先配置的Meld(Beyond Compare)解決沖突:
上面左右兩個(gè)窗口依次是“LOCAL”闲延、“REMOTE”,它們只是提供解決沖突需要的信息韩玩,是無法編輯的垒玲。中間的窗口是合并后的結(jié)果,可以手動(dòng)修改找颓,也可以點(diǎn)擊相應(yīng)顏色的箭頭選擇“LOCAL”或者“REMOTE”合愈。
如果不向解決沖突,回到之前狀態(tài),可執(zhí)行:
$ git rebase --abort
3. 代碼提交完整流程
步驟如下:
git add -A
git commit -m "message"
git pull --rebase (或者git fetch + git rebase)
解決沖突
git add 沖突文件
git rebase –continue
git push
其中佛析,3益老、4、5點(diǎn)寸莫,如果沒遇到?jīng)_突就不用進(jìn)行捺萌,直接push上去。
當(dāng)遇到?jīng)_突時(shí)储狭,git會(huì)提示patch failed,并要我們解決問題了再執(zhí)行g(shù)it rebase --continue