git分支合併與rebase

史前圖騰發表於2017-12-13

merge與rebase

1.一個新功能需求開發產生一個新的feature分支feature-some

git checkout -b feature-some develop
複製程式碼

2.feature-some完成開發及測試

git add somefiles

git commit -m "message"
複製程式碼

3.需要合併到develop分支-git merge

git checkout develop

git merge feature-some

git resolved conflicts

git add modfiy

git commit -m "message"

git push origin develop
複製程式碼

這時使用git log會看到明顯的git merge資訊,並不是自己寫的message

如果讓分支歷史看起來像沒有經過任何合併一樣,你也許可以用 git rebase

4.需要合併到develop分支(如果develop分支是共享的,最好不要這樣做)

git checkout develop

git rebase feature-some

//解決衝突後
git add .

git rebase--continue

git push
複製程式碼

在任何時候,你可以用--abort引數來終止rebase的行動,並且"mywork" 分支會回到rebase開始前的狀態。

git rebase--abort
複製程式碼

5.更常用的是將develop分支的最新內容引入到正在開發的feature中 最好是在feature分支push前進行操作,可減少衝突

git checkout feature

git rebase develop

//解決衝突後
git add .

git rebase--continue

git push
複製程式碼

附:常用命令:

* git diff
HEAD     commit版本
Index     staged版本

a、檢視尚未暫存的檔案更新了哪些部分,不加引數直接輸入
    git diff
此命令比較的是工作目錄(Working tree)和暫存區域快照(index)之間的差異
也就是修改之後還沒有暫存起來的變化內容。

b、檢視已經暫存起來的檔案(staged)和上次提交時的快照之間(HEAD)的差異
    git diff --cached
    git diff --staged
顯示的是下一次commit時會提交到HEAD的內容(不帶-a情況下)


c、顯示工作版本(Working tree)和HEAD的差別
    git diff HEAD

d、檢視當前目錄和另外一個分支的差別
    git diff test
複製程式碼
git checkout
恢復某個已修改的檔案(撤銷未提交的修改):
$ git checkout file-name

例如:git checkout src/com/android/.../xxx.java

比如修改的都是java檔案,不必一個個撤銷,可以使用

$ git checkout *.java

撤銷所有修改

$ git checkout .
複製程式碼
git cat-file
git cat-file -t,檢視Git物件的型別,主要的git物件包括tree,commit,parent,和blob等。

git cat-file -p,檢視Git物件的內容
複製程式碼
1.改完bug忘記切換分支了,程式碼改了很多怎麼辦。

git add .      (把所有改動暫存)

git stash     (把暫存的檔案提交到git的暫存棧)

git checkout 本該提交程式碼的分支 

git stash pop (將暫存棧中的程式碼放出來)



2.程式碼不但改了,還提交了怎麼辦。

git  checkout 錯誤分支

git reset HEAD~1  (最近一次提交放回暫存區, 並取消此次提交)

git stash                   (把暫存的檔案提交到git的暫存棧)

git checkout 正確分支

git stash pop        (把git暫存棧的檔案取出)

git push origin 錯誤的分支 -f  (把不該上去的檔案回退掉)

複製程式碼

分支切換和增刪

  1. 檢視遠端分支
git branch -r
origin/master
複製程式碼

回到頂部 2. 檢視本地分支

git branch 
*master
注:以*開頭指明現在所在的本地分支
複製程式碼

回到頂部 3. 檢視本地分支和遠端分支

git branch -a
*master
remotes/origin/master
複製程式碼

回到頂部 4. 建立分支

*新建一個分支,但依然停留在當前分支
git branch [branch-name]
*新建一個分支,並切換到該分支上
git branch -b [branch-name]
複製程式碼

4-1 建立本地分支

$ git branch test_1
$ git branch -a
  *master
  test_1
  remotes/origin/master
  注:建立本地分支時,預設是把所在的本地分支的東西拷貝給新建本地的分支。
複製程式碼

4-2 把本地分支推送到遠端作為遠端分支

$ git push origin test_1
To git@******
 * [new branch]      test_1 -> test_1
$ git branch -a
*master
  test_1
  remotes/origin/master
  remotes/origin/test_1
複製程式碼

注:git push origin test_1會把本地的test_1分支推送到遠端,本地test_1分支和遠端的對應關係是test_1-->test_1 如果本地根本沒有分支test_9,推送的話會提示錯誤 回到頂部 5. 切換到分支

$ git checkout test_1
Switched to branch 'test_1'
複製程式碼

回到頂部 6. 刪除本地分支

$ git branch -a
  master
  test_1
  test_2
  remotes/origin/master
  remotes/origin/test_1
  remotes/origin/test_2
$ git branch -d test_2
Deleted branch test_2 (was c470057).
$git branch -a
  master
  test_1
  remotes/origin/master
  remotes/origin/test_1
  remotes/origin/test_2
複製程式碼

可以看到本地分支test_2刪除了 回到頂部 7. 刪除遠端分支

$ git branch -a
*master
  test_1
  remotes/origin/master
  remotes/origin/test_1
  remotes/origin/test_2
$ git push origin :test_2
To git@*********- [deleted]         test_2
$ git branch -a
*master
  test_1
  remotes/origin/master
  remotes/origin/test_1
複製程式碼

注:git push origin :*** 就是刪除遠端分支的意思,和剛才我刪除本地無關。如下面,我留著本地test_1分支,只是刪除了遠端的分支test_1

$ git push origin :test_1
To git@********
 - [deleted]         test_1
$ git branch -a
*master
  test_1
  remotes/origin/master
複製程式碼

遠端分支已經刪除,但本地仍然顯示,則修剪一下

git remote prune origin
複製程式碼

相關文章