把全部的變化都放在master分支並非最好的作法. 建議的作法是把變化放在分支裏面.html
至少應該準備一個feature分支之類的, 把變化都隔離開來, 而後等到全部的功能都穩定以後再合併到master分支.git
說到分支, 就得使用git branch命令.vim
git branch 會列出全部的本地分支.工具
git branch -a 會列出本地和遠程的全部分支.post
git branch
git branch -a
綠色的是本地的分支, 紅色的是遠程分支.url
星號是表示這時當前活躍的分支.spa
git branch 分知名:指針
git branch mynewbranch
想切換分支的話, 須要使用git checkout 分知名 這個命令code
git checkout mynewbranch
那再看看歷史紀錄: htm
由於我如今尚未作任何更改, 因此這些分支都指向同一個commit, 其實分支就是標籤/指針而已.
再切換到master分支: git checkout master.
而後使用git branch -m 分支名 新分知名 來進行更名操做.
注意不能刪除當前活躍的分支.
使用命令git branch -d 分支名.
git branch -d newbranch
快捷操做: 切換並建立分支:
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了.
添加一個分支, 而且換到該分支:
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.