gitlab
設置分支保護 Settinsg->Repository->Protected Branches->Expand可以設置分支保護;
eclipe解決沖突 見CSDN http://blog.csdn.net/rosten/article/details/17068285;
多人merge時pull的這個時間關系不取決于誰先執(zhí)行push混狠,而取決于本地倉庫中誰先執(zhí)行commit。所以merge會按照時間順序嚴格的記錄每一次commit赖临。
rebase操作更復雜屏富,沖突的概率也更高,并且不是按照時間順序記錄。
對于一個多人開發(fā)團隊頻繁提交更新的情況翠忠,如果使用merge會使得歷史線圖非常復雜,并且merge一次就會新增一個記錄點乞榨,如果使用rebase就是完全的線性開發(fā)秽之。
-
如果同一文件反復修改或提交次數(shù)比較多,預期會出現(xiàn)很多的conflict吃既,那么可以使用merge合并考榨,僅需要解決一次沖突即可(不過,大范圍主題式的修改鹦倚,是不是應該事先就新開一個分支呢河质?);如果修改范圍小,預期conflict少掀鹅,則建議使用rebase散休。
重寫歷史
1.改變最近一次提交
改變提交說明,或者改變剛剛通過增加淫半,改變溃槐,刪除而記錄的快照。
git commit --amend
執(zhí)行命令后將帶入文本編輯器科吭,里面包含了最近一次提交說明昏滴,供修改。當保存并退出編輯器对人,這個編輯器會寫入一個新的提交谣殊,里面包含了那個說明,并且讓它成為新的最近一次提交牺弄。
如果你完成提交后又想修改被提交的快照姻几,增加或者修改其中的文件,可能因為你最初提交時势告,忘了添加一個新建的文件蛇捌,這個過程基本上一樣。你通過修改文件然后對其運行
git add
或對一個已被記錄的文件運行git rm
咱台,隨后的git commit --amend
會獲取你當前的暫存區(qū)并將它作為新提交對應的快照 络拌。2.修改多個提交說明
可以通過給
git rebase
增加-i
選項來以交互方式地運行rebase。必須通過告訴命令衍合到哪次提交回溺,來指明需要重寫的提交的回溯深度春贸。如,如果想修改最近三次的提交說明遗遵,或者其中任意一次萍恕,你必須給
git rebase -i
提供一個參數(shù),指明你想要修改的提交的父提交车要,例如HEAD~2
或者HEAD~3
允粤。可能記住~3
更加容易翼岁,因為你想修改最近三次提交维哈;但是請記住你事實上所指的是四次提交之前,即你想修改的提交的父提交登澜。git rebase -i HEAD~3
運行這個命令會為文本編輯器提供一個提交列表阔挠,看起來像下面這樣
pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit
請注意這里的倒序。交互式的rebase給了一個即將運行的腳本脑蠕。它會從在命令行上指明的提交開始(
HEAD~3
)然后自上至下重播每次提交里引入的變更购撼。它將最早的列在頂上而不是最近的跪削,因為這是第一個需要重播的。需要修改這個腳本來讓它停留在你想修改的變更上迂求。要做到這一點碾盐,你只要將你想修改的每一次提交前面的pick改為edit。例如揩局,只想修改第三次提交說明的話毫玖,你就像下面這樣修改文件:
edit f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file
當你保存并退出編輯器,Git會倒回至列表中的最后一次提交凌盯,然后返回命令行中付枫,輸入
git commit --amend
修改提交說明,退出編輯器驰怎。然后阐滩,運行
git rebase --continue
這個命令會應用其他兩次提交。3. 重排提交
使用交互式衍合來重排或刪除提交如果县忌,你想刪除"added cat-file"這個提交并且修改其他兩次提交引入的順序掂榔,你將rebase腳本從這個
pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file
改為這個:
pick 310154e updated README formatting and added blame pick f7f3f6d changed my name a bit
當你保存并退出編輯器,Git 將分支倒回至這些提交的父提交症杏,應用
310154e
装获,然后f7f3f6d
,接著停止厉颤。有效地修改了這些提交的順序并且徹底刪除了"added cat-file"這次提交穴豫。4.壓制(Squashing)提交
如果不用"pick"或者"edit",而是指定"squash"走芋,Git 會同時應用那個變更和它之前的變更并將提交說明歸并绩郎。因此潘鲫,如果想將這三個提交合并為單一提交翁逞, 可以將腳本修改成這樣
pick f7f3f6d changed my name a bit
squash 310154e updated README formatting and added blame
squash a5f4a0d added cat-file
保存并退出編輯器,Git 會應用全部三次變更然后將送回編輯器來歸并三次提交說明溉仑。
# This is a combination of 3 commits.
# The first commit's message is:
changed my name a bit
# This is the 2nd commit message:
updated README formatting and added blame
# This is the 3rd commit message:
added cat-file
然后保存挖函,就會擁有包含前三次提交的全部變更的單一提交 。
注:最頂行pick 不能修改為squash
存儲(Stashing)
當你正在進行項目中某一部分的工作浊竟,里面的東西處于一個比較雜亂的狀態(tài)怨喘,而你想轉到其他分支上進行一些工作。問題是振定,你不想提交進行了一半的工作必怜,否則以后你無法回到這個工作點。解決這個問題的辦法就是git stash
命令后频。
“‘儲藏”“可以獲取工作目錄的中間狀態(tài)——也就是修改過的被追蹤的文件和暫存的變更——并將它保存到一個未完結變更的堆棧中梳庆,隨時可以重新應用暖途。
當追準備切換分支,但是還不想提交你正在進行中的工作膏执;所以儲藏這些變更驻售。為了往堆棧推送一個新的儲藏,只要運行?git stash
:
這時更米,你可以方便地切換到其他分支工作欺栗;你的變更都保存在棧上。要查看現(xiàn)有的儲藏征峦,你可以使用?git stash list
:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
git stash apply
:重新應用你剛剛實施的儲藏
git stash apply stash@{number}
:應用更早的儲藏
合并分支
只需回到需要合并的源分支迟几,運行git merge
命令指定要合并進來的分支即可;Git 作了合并眶痰,但沒有提交瘤旨,它會停下來等你解決沖突。要看看哪些文件在合并時發(fā)生沖突竖伯,可以用git status
觀察
任何包含未解決沖突的文件都會以未合并(unmerged)的狀態(tài)列出存哲。Git 會在有沖突的文件里加入標準的沖突解決標記,可以通過它們來手工定位并解決這些沖突七婴∷钔担可以看到此文件包含類似下面這樣的部分:
<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53
可以看到=======
隔開的上半部分,是?HEAD
(即master
分支打厘,在運行merge
命令時所切換到的分支)中的內容修肠,下半部分是在iss53
分支中的內容。解決沖突的辦法無非是二者選其一或者親自整合到一起户盯。比如可以通過把這段內容替換為下面這樣來解決:
<div id="footer">
please contact us at email.support@github.com
</div>
在解決了所有文件里的所有沖突后嵌施,運行?git add
?將把它們標記為已解決狀態(tài)(譯注:實際上就是來一次快照保存到暫存區(qū)域。)
Pull 沖突
pull時為了防止更改后pull Feiled的出現(xiàn)莽鸭,先執(zhí)行commit,stash or revert吗伤。
- 執(zhí)行pull
- 因為存在代碼沖突,所以接下來會自動彈出merge融合窗口硫眨,如下圖:
-
點擊merge足淆,進入下圖:下圖中,左邊是本地修改后的礁阁,右邊是遠程git上面的巧号,中間是修改后結果Result。我們可以通過修改Result一欄得到解決沖突的結果
merge.png
- 編譯之后點Apply這樣沖突就解決了姥闭,但是我們還需要提交本地代碼到本地和遠程倉庫中 git -- commit files--丹鸿,提交代碼到本地或者遠程倉庫 。
版本回退
git log --pretty=oneline
簡潔顯示最近到最遠的提交日志在Git中棚品,用
HEAD
表示當前版本靠欢,也就是最新的提交弥姻,上一個版本就是HEAD^
,上上一個版本就是HEAD^^
掺涛,當然往上100個版本寫100個^
比較容易數(shù)不過來庭敦,所以寫成HEAD~100
。現(xiàn)在薪缆,把當前版本回退到上一個版本秧廉,可以使用
git reset --hard HEAD^
。使用git log
查看現(xiàn)在版本庫的狀態(tài)會發(fā)現(xiàn)最新的版本以及看不到了拣帽,可以使用git reset --hard 版本號
返回最新版本git checkout -- file
可以丟棄工作區(qū)的修改 疼电,實質上就是讓這個文件回到最近一次git commit
或git add
時的狀態(tài)。 文件已修改减拭,未add到暫存區(qū):git checkout -- file
可還原蔽豺;文件已修改,并add到暫存區(qū)未commit:git read HEAD file git checkout -- file
可還原; 文件已修改拧粪,并add到暫存區(qū)已commit修陡,參考上文版本退回或者重置提交。