天天看點

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

基本指令 http://www.cnblogs.com/cgzl/p/8621673.html

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

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

列出所有的分支:

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

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

git branch
git branch -a      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

星号是表示這時目前活躍的分支.

建立分支:

git branch 分知名:

git branch mynewbranch      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

切換分支.

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

git checkout mynewbranch      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

那再看看曆史紀錄: 

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

修改分支名.

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

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

删除分支.

注意不能删除目前活躍的分支.

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

git branch -d newbranch      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

Fast Forward 合并 http://www.cnblogs.com/cgzl/p/8621920.html

快捷操作: 切換并建立分支: 

git checkout -b 分支名.

git checkout -b some-change      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後我打開某個檔案(index.html)修改一下标題.

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

Commit之後檢視曆史紀錄, 可以看到再some-change分支裡, 修改了index.html的title.

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

首先要切換回到master分支:

git checkout master      

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

git diff master some-change      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

也可以可視化檢視: 

git difftool master some-change      

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後按esc再按:q退出.

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

git merge some-change      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

可以看到裡面列出了所涉及的commits, 并且這是一個fast-forward合并, 所涉及的檔案, 以及有哪些變化.

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

合并後的狀态如下:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

合并之後, 就不需要這個分支了, 删除:

git branch -d some-change      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

這時, git log裡面隻有master了.

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

禁用 Fast Forward 合并 http://www.cnblogs.com/cgzl/p/8622040.html

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

git checkout -b add-text      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後我再index.html裡面添加點文字, 并commit.

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

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後把這個分支合并到master分支.

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

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

這樣做的話, 将會出現一個新的合并commit, 

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後檢視git log:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

最後删除這個分支, 并檢視log:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

可以看到, 删除分支以後, log裡面分支的名沒有了, 但是分支還在.

自動合并

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

建立一個分支并切換:

git checkout -b simple-changes      

修改一個檔案然後commit:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後回到master分支:

再修改某個檔案, 然後commit:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

檢視log:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

這種情況可以這麼合并:

git merge 被合并進來的分支 -m "自定義資訊".

git merge simple-changes -m "merging changes from simple-changes"      
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

最後删除分支, 檢視log:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

可以打開兩個檔案看看, 改變的内容都保留着了.

解決合并的沖突 http://www.cnblogs.com/cgzl/p/8623236.html

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

首先建立一個分支, 并切換到該分支上:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

然後檢視狀态, 并commit:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後切換到master, 并編輯同一個檔案:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

commit:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後檢視log:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

下面進行合并:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

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

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

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

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

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

按圖示操作, 點選圖示選擇不同的版本, 最後點選儲存即可.

關閉p4merge:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後commit:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

commit之後, 狀态就不再是merging了, 但是會出現一個未被追蹤的檔案:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

然後檢視狀态:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

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

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

最後可以删除 realwork 分支了:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突
Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突

Ok.

下面是我的關于ASP.NET Core Web API相關技術的公衆号--草根專欄:

Git -- 分支與合并 (指令行+可視化工具p4merge)基本指令Fast Forward 合并禁用 Fast Forward 合并自動合并解決合并的沖突