Git -- 分支與合並 (命令行+可視化工具p4merge)


基本命令

把所有的變化都放在master分支並不是最好的做法. 建議的做法是把變化放在分支里面.

至少應該准備一個feature分支之類的, 把變化都隔離開來, 然后等到所有的功能都穩定之后再合並到master分支.

說到分支, 就得使用git branch命令.

列出所有的分支:

git branch 會列出所有的本地分支.

git branch -a 會列出本地和遠程的所有分支.

git branch
git branch -a

 

綠色的是本地的分支, 紅色的是遠程分支.

星號是表示這時當前活躍的分支.

 

創建分支:

git branch 分知名:

git branch mynewbranch

 

 

切換分支.

想切換分支的話, 需要使用git checkout 分知名 這個命令

git checkout mynewbranch

 

那再看看歷史紀錄: 

因為我現在還沒有做任何更改, 所以這些分支都指向同一個commit, 其實分支就是標簽/指針而已.

 

修改分支名.

再切換到master分支: git checkout master.

然后使用git branch -m 分支名 新分知名 來進行改名操作.

 

刪除分支.

注意不能刪除當前活躍的分支.

使用命令git branch -d 分支名.

git branch -d newbranch

 

 

Fast Forward 合並

快捷操作: 切換並創建分支: 

git checkout -b 分支名.

git checkout -b some-change

 

然后我打開某個文件(index.html)修改一下標題.

Commit之后查看歷史紀錄, 可以看到再some-change分支里, 修改了index.html的title.

如果我想要把這個commit合並到master分支.

首先要切換回到master分支:

git checkout master

 

然后, 我需要知道發生了哪些變化, 也就是比較這兩個分支:

git diff master some-change

 

也可以可視化查看: 

git difftool master some-change

 

我這台電腦沒有配置p4merge, 所以默認的可能是使用vimdiff可視化工具:

然后按esc再按:q退出.

最后就是合並變化: git merge 需要被合並進來的分支名.

git merge some-change

 

可以看到里面列出了所涉及的commits, 並且這是一個fast-forward合並, 所涉及的文件, 以及有哪些變化.

 

因為這是一個Fast Forward合並, Git把feature分支后來所有的commits都放在了master分支上, 就像沒有分開過一樣:

但是Fast-forward合並只有在滿足這個條件的時候才可能執行: 合並的時候master分支沒有任何變化.

合並后的狀態如下:

合並之后, 就不需要這個分支了, 刪除:

git branch -d some-change

 

這時, git log里面只有master了.

 

禁用 Fast Forward 合並

添加一個分支, 並且換到該分支:

git checkout -b add-text

 

然后我再index.html里面添加點文字, 並commit.

然后再修改README.md, 添加文字, commit.

現在在 add-text這個分支上, 有兩個commit, 看下log:

 

然后把這個分支合並到master分支.

首先切換到master分支, 然后再進行git merge, 但是這一次, 我想把我這個分支的過程留下痕跡, 所以要禁用fast-forward 合並:

git merge 要被合並進來的分支 --no-ff.

這樣做的話, 將會出現一個新的合並commit, 

然后查看git log:

可以看到, 整個分支的過程被記錄了下來.

最后刪除這個分支, 並查看log:

可以看到, 刪除分支以后, log里面分支的名沒有了, 但是分支還在.

 

自動合並

創建一個分支並切換:

git checkout -b simple-changes

 

修改一個文件然后commit:

然后回到master分支:

再修改某個文件, 然后commit:

查看log:

紅線里面那部分就比較有趣了, 兩個分支都有變化/commits.

這種情況可以這么合並:

git merge 被合並進來的分支 -m "自定義信息".

git merge simple-changes -m "merging changes from simple-changes"

 

查看log:

可以看到分支的合並已經完成了.

最后刪除分支, 查看log:

效果一樣, 分支名沒了, 但是分支的歷史還是保留着的.

可以打開兩個文件看看, 改變的內容都保留着了.

 

解決合並的沖突

如果兩個分支上都對同一個文件進行了修改, 那么就有可能發生沖突.

 

首先創建一個分支, 並切換到該分支上:

然后修改index.html, 修改幾個地方吧.

然后查看狀態, 並commit:

然后切換到master, 並編輯同一個文件:

而這時index.html並不是realwork分支修改后的樣子, 而是修改之前的樣子:

然后修改index.html, 修改幾處可能引起沖突的地方.

commit:

然后查看log:

接下來最應該做的就是diff:

也可以使用可視化工具進行diff:

下面進行合並:

不出所料, 沖突發生了, 自動合並失敗.

現在的狀態, 應該叫做Merging狀態.

現在打開index.html是這樣的:

可以看到兩處沖突, 每處都有HEAD(master)版的和realwork分支版的.

上圖我使用的是Visual Studio Code, 可以點擊上面的按鈕來進行沖突的解決, 也可以手動修改文件進行解決.

但是在這里我使用我配置好的mergetool:

git mergetool. 這個命令將會打開p4merge(我本機配置的mergetool):

按圖示操作, 點擊圖標選擇不同的版本, 最后點擊保存即可.

關閉p4merge:

然后commit:

commit之后, 狀態就不再是merging了, 但是會出現一個未被追蹤的文件:

這是因為在解決沖突的時候, git會保存一個帶有觸痛的原始版本, 以備不時之需:

但是.orig文件是不應該被追蹤的, 所以需要添加到.gitignore文件中:

然后查看狀態:

這次只有.gitignore發生了變化.

commit:

最后可以刪除 realwork 分支了:

查看log:

Ok.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM