Try   HackMD

Git 使用分支

tags: Git

為什麼要使用分支

影分身術!

影分身術

開始使用分支

# 新增分支
$ git branch cat

# 砍分隻
$ git branch -d dog

# 所有分支都可以刪,沒有說 master 就比較偉大,他只是預設主線
# 前提:你不能刪掉目前所在branch

# 切換分支
$ git checkout cat

# 如果dog分支不存在,建好再切過去
$ git checkout -b dog

對分支的誤解

分支就像貼紙

合併分支

# 同源:快轉模式合併 fast-forward
$ git checkout master
$ git merge cat

為什麼我的分支都沒有「小耳朵」?

分支就像貼紙

# 我不要用快轉模式
$ git merge cat --no-ff

不小心把還沒合併的分支砍掉了,救得回來嗎?

其實git會提醒你,還沒合併喔,確定嗎?
刪除分支並不會造成那些commit消失

$ git branch
cat
* master

$ git branch -d cat
error: The branch cat is not fully merged.

$ git branch -D cat
Deleted branch cat (was 6fb6143)

# 活過來!
$ git branch new_cat 6fb6143
$ git branch
* master 
cat

$ git merge new_cat

# 如果SHA-1沒記下來怎辦?
$ git reflog

其實你合併的不是分支,是合併分之所指向的那個commit

另一種合併方式(使用 rebase)

移花接木

Screenshot 0006-02-05 at 11.39.48 PM

$ git rebase dog

Screenshot 0006-02-05 at 11.40.14 PM

# 怎樣取消rebase?
$ git reset HEAD^ # 並不會回到原來rebase前的狀態

# 方法一:
$ git reflog
$ git reset  6fb6143 --hard

# 方法二(相對簡單):
$ git reset ORIG_HEAD

合併發生衝突了,怎麼辦?

# 使用merge的合併造成衝突
$ git merge cat
$ vi index.html

# 如果是使用rebase的合併造成衝突?
$ git rebase cat 
$ vi index.html
$ git add index.html
$ git rebase --continue

# 如果不是文字檔的衝突?(圖片檔等等)
$ git merge cat
$ vi index.html
$ git status
$ git checkout cute_animal.png --theirs # 用他們的
$ git checkout cute_animal.png --ours # 用我們的

為什麼大家都說在 Git 開分支「很便宜」?

$ git branch
cat 
* dog
master

$ cd .git
$ open .
$ cat HEAD
# 所謂分支,其實就是某一個commit的SHA-1值
$ cat refs/heads/dog
$ cat refs/heads/cat
$ cat refs/heads/master

Git 怎麼知道現在是在哪一個分支?

$ cat .git/HEAD

# HEAD 也有縮寫
$ git reset HEAD^
# 可以換成:
$ git reset @^

ORIG_HEAD是什麼?當你危險操作的前一個HEAD的值

我可以從過去的某個 Commit 再長一個新的分支出來嗎?

$ git checkout 節點
$ git checkout -b bird
$ touch bird1.html
$ git add bird1.html
$ git commmit -m "add bird 1"