操作命令記錄

cherry-pick

cherry-pick隘世,就是下面ruby_client不想要整個分支松嘶,只想要e43a6念恍,那就櫻桃挑選e43a6就可以犁功。

Paste_Image.png

Paste_Image.png

關(guān)于Branch

  1. Creating a New Branch,
    只是創(chuàng)建啦testing branch晾蜘,并不切換到testing
$ git branch testing
  1. 查看branch歷史
    會顯示所有它的commit,還會顯示哪個branch指向哪個commit邻眷,還有HEAD當前指向哪個branch眠屎。
$ git log --oneline --decorate

這個命令顯示branch歷史是圖形樣式的剔交。

$ git log --oneline --decorate --graph --all
  1. 切換branch
    working tree里面文件都變成testing所指向那個commit指向的那個snapshot的樣子。
    HEAD文件也從原來的branch變成指向testing branch
$ git checkout testing
  1. 新建并切換branch
    該命令新建一個iss53 branch改衩,并且切換到該branch
$ git checkout -b iss53
//上面一句相當于下面兩句命令岖常。
$ git branch iss53
$ git checkout iss53
  1. 刪除分支
    刪除名為hotfix的分支。
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
  1. 列出所有的branch
    帶有*的是現(xiàn)在checkout的branch
$ git branch
  iss53
 * master
  testing

顯示各個branch最后一次commit信息

git branch -v
  iss53     93b412c fix javascript issue
 * master  7a98805 Merge branch 'iss53'
  testing   782fd34 add scott to the author list in the readmes

--merged--no-merged兩個參數(shù)可以過濾branch

//顯示已經(jīng)merge到當前分支(master)的branch葫督,過濾其他的
$ git branch --merged 
  iss53
 * master
//顯示沒有merge到當前分支的branch
$ git branch --no-merged 
  testing
//因為testing branch沒有merge到當前分支竭鞍,所以不能直接刪除
$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

關(guān)于remote branch

  • remote branch是不能移動的板惑,它會自動根據(jù)服務器的branch進行移動。
  1. 查看remote branch的信息
git ls-remote [remote]
git remote show [remote]
  1. 克隆遠程倉庫
git clone //默認存儲到origin/master偎快,就是遠程服務默認名為origin
git clone -o booyah  //該命令冯乘,使得倉庫存儲到booyah/master
  1. 從遠程倉庫獲取更新
    • 從服務器獲取本地沒有的分支。
      如果服務器有個新的分支叫serverfix晒夹,本地沒有
      git fetch origin會獲取更新裆馒,但我們不會有一個新的本地的serverfix分支,只有一個origin/serverfix遠程分支丐怯,而且還是不能修改的喷好。
git fetch origin

origin/serverfix遠程分支合并當前所在的本地分支上

git merge origin/serverfix

也可以新建一個本地分支(serverfix),checkout這個origin/serverfix遠程分支

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

下面三個命令做的是同樣的事情读跷。

// 正常命令梗搅,從origin/serverfix獲取并創(chuàng)建本地的serverfix分支。
$ git checkout -b serverfix origin/serverfix
// 上面操作太常用效览,所以git提供啦更簡單的命令
$ git checkout --track origin/serverfix
/* 
下面這個命令无切,更加簡單,當本地不存在“serverfix”分支丐枉,
且遠程服務中订雾,有且只有一個與“serverfix”名字匹配的分支“
git就會自動創(chuàng)建本地分支。
*/
$ git checkout serverfix
  - 設(shè)置本地分支的上游分支(就是本地對應遠程分支)
//-u 參數(shù)代表(upstrem branch)的縮寫
$ git branch -u origin/serverfix
  - 從服務器獲取remote branch的更新矛洞,并合并到當前分支

假設(shè)洼哎,當前在master分支上,且master分支的(upstream branch)是 origin/master

$ git fetch origin
$ git fetch --all  //這個命令代替上一個沼本,就會把所有遠程分支都更新噩峦。
//--------------------------------------------------
$ git merge origin/master
//下面兩句命令用@{u}和@{upstream}代替origin/master,比較方便
$ git merge @{u}
$ git merge @{upstream}
  - git pull
$ git pull 
//git pull == git fetch + git merge 一個命令其實就是兩個的結(jié)合
$ git fetch 
$ git merge
  - 刪除遠程服務器無用的branch
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
 -[deleted]         serverfix
  1. 添加新的遠程服務
git remote add teamone https://sss.github.com/sss/ss
  1. 推送更新到遠程服務
    • 將遠程沒有的本地分支抽兆,推送到遠程服務器與別人共享
$ git push <remote> <branch>
$ git push origin serverfix

這里git會自動把serverfix擴展成
refs/heads/serverfix:refs/heads/serverfix识补,就是說把我本地的serverfix更新到遠程的serverfix分支中。

git push origin serverfix:serverfix  //這種寫法也可以
git push origin serverfix:awesomebranch 
//推送到遠程分支時辫红,分支名叫awesomebranch
  1. 查看本地branch與遠程branch的關(guān)系
    輸出結(jié)果解釋:
    • iss53分支:追蹤origin/iss53凭涂,ahead 2表示本地有兩個commit未推送到遠程
    • master分支:追蹤origin/master,是與遠程分支一致的最新版本
    • serverfix分支:追蹤teamone/server-fix-good贴妻,遠程分支有一個commit為下載并merge到本地切油,本地有三個commit未推送到遠程。
    • testing分支:是完全本地的分支名惩,不追蹤任何遠程分支澎胡。
$ git branch -vv
  iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
  master    1ae2a45 [origin/master] deploying index fix
*serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
  testing   5ea463a trying something new

關(guān)于staging area

  1. 添加文件到staging area
$ git add README test.rb LICENSE
  1. 查看staging area的狀態(tài)
git status

關(guān)于commit

  1. 提交,直接輸入信息
$ git commit -m 'The initial commit of my project'
  1. 提交,打開編輯器輸入信息
$ git commit 
  1. -a 選項攻谁,告訴git提交前稚伍,自動將修改回刪除的文件添加到staging area。
    但是新增加的戚宦,git還沒有track的文件不會添加進去个曙。
$ git commit -a -m 'made a change'

關(guān)于git diff

  1. 檢查有沒有whitespace issues(不知道這是什么,先記下來吧)
    在commit之前執(zhí)行該命令受楼。
git diff --check

關(guān)于merge

  1. 將一個branch合并到另一個
    假設(shè)目前在hotfix上修復問題困檩,問題修復完成要合并到主分支
    先切換到主分支master,然后git merge hotfix
$ git checkout master
$ git merge hotfix
  1. merge的兩種狀況
  • Fast-forward
    如圖一所示,hotfix對master中的緊急問題進行啦修復
    修復完畢后那槽,要把hotfix合并到master中悼沿,那么這種情況下,git merge命令直接就把masterbranch移動到hotfix所在commit(就是c4)
    命令執(zhí)行時會顯示骚灸,是Fast-forward糟趾,因為這種情況的合并是簡單的移動啦master分支。合并后如圖二所示甚牲。
    并且此時hotfix分支沒什么鳥用啦义郑,可以刪除掉。
    圖一

    圖二
  • Merge made by the 'recursive' strategy.
    第二種狀況丈钙,要合并的兩個分支已經(jīng)不再同一條線上非驮,從C2開始分裂成兩條線啦。如圖三所示雏赦。
    如下的合并命令雖然跟之前的一樣劫笙,但結(jié)果發(fā)生的事情不一樣啦。
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

這種合并星岗,會基于圖四所示的三個Commit(C2填大、C4、C5)俏橘,兩個是分支所指向的commit允华,一個是那兩個commit的共同祖先。
最終生成一個新的commit obejct,如圖五所示的C6寥掐。(Fast-forward類型的merge不產(chǎn)生新的commit)
C6叫做Merge commit靴寂,它有兩個parent(C4和C5),這就是Merge commit特殊的地方召耘。
合并完畢后百炬,如果iss53沒用啦,可以刪除掉怎茫。


圖三

圖四

圖五

Merge沖突的處理過程

下面merge命令執(zhí)行后收壕,顯示有沖突

$ git merge iss53 

沖突后妓灌,Git就暫停啦merge commit的創(chuàng)建轨蛤,可以用下面命令看是哪些文件沖突蜜宪。

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

有沖突的文件在Unmerged paths條目下列出。
結(jié)果中提示啦祥山,用git add命令來標記沖突文件問題已經(jīng)解決圃验。
下面是沖突文件中的沖突內(nèi)容的樣子,上下兩個分支名(HEAD缝呕、iss53)澳窑,(=======)上面屬于HEAD,(=======)下面屬于iss53供常。

<<<<<<< HEAD:index.html
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

如果想用可視化工具來解決沖突摊聋,用下面的命令就行。
運行命令后輸出的文字中栈暇,提示啦可以使用的mergetools麻裁,在命令行中輸入想要用的工具,比如說輸入:kdiff3源祈,git就會打開那個工具來進行沖突修改煎源。
如果有多個沖突文件,如下面Merging列出啦:LICENSE和README香缺,會依次打開兩個沖突進行修改手销。

$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc codecompare emerge vimdiff
Merging:
LICENSE
README

當然也可以直接用vim來修改沖突文件。

vim README 

沖突修改完畢后图张,使用git mergetool命令锋拖,會自動將沖突文件add到staging area,而vim README命令需要手動用git add來將文件添加。
最后祸轮,提交就好啦姑隅。

git commit

關(guān)于rebase

  1. 最簡單的rebase
    倉庫的狀態(tài)如圖一所示:
    1.下載master分支時,只有C2倔撞,基于C2新建分支(experiment)分支讲仰,進行修改
    2.然后別人對倉庫進行啦push,master更新到C3
    4.我們可以使用rebase操作將experiment的修改應用到C3


    圖一:初始的倉庫狀態(tài)
$ git checkout experiment
$ git rebase master

兩行命令作啦啥痪蝇?
1.對比experiment分支所有commit相對于兩個分支的共同祖先(C2)的內(nèi)容區(qū)別鄙陡,將這些區(qū)別存儲到臨時文件中。
2.把當前分支(experiment)重新設(shè)定到rebase指定的分支(master)的commit(也就是C3)上躏啰,然后將臨時文件中存儲的內(nèi)容區(qū)別應用到C3上趁矾,產(chǎn)生C4'
3.最后experiment分支設(shè)定到C4'上。
4.其實rebase相對于merge的好處是给僵,減少歷史信息毫捣,如圖二详拙,在rebase操作后, 就變成啦一條線蔓同,C4就消失啦(不過其實C4的對象仍然有存著的饶辙,過一段時間運行GC才會刪除)

圖二:rebase結(jié)果

$ git checkout master
$ git merge experiment

最后就是合并啦,這次Merge屬于Fast-forward,Master直接往前移動一下就好啦斑粱。


圖三:合并
  1. 更有趣一點的rebase


    圖四:
$ git rebase --onto master server client

將C8和C9的修改直接應用到master分支上弃揽。
結(jié)果如圖五所示,注意C3的內(nèi)容不會被應用到master上则北,只有C8和C9的修改會矿微。


圖五:跨越分支rebase
$ git checkout master
$ git merge client

將client合并進master分支,fast-foward


圖六:rebase后merge
git rebase [basebranch] [topicbranch]
$ git rebase master server

server分支在master上rebase


$ git checkout master
$ git merge server
$ git branch -d client
$ git branch -d server
把server合并到master后
  1. rebase會引發(fā)的問題與解決辦法
    我們進行啦開發(fā)尚揣,產(chǎn)生C2 和 C3
    初始狀態(tài):服務器有master分支涌矢,指向C1,本地clone后基于C1進行開發(fā)

    我們進行啦Fetch快骗,得到C4娜庇、C5、C6滨巴,進行merge得到C7
    然后別人push到服務器帶有merge歷史的操作思灌,我們fetch下來進行merge

    別人強制覆蓋啦服務器的merge,改為rebase,產(chǎn)生C4'恭取,然后我們fetch下來
    提交merge的那人在自己電腦上重新rebase泰偿,覆蓋掉啦merge,同時強制推送到服務器蜈垮,我們又fetch啦

    我們用啦git pull耗跛,把C7與C4'合并得到C8,但是C4和C4'修改的內(nèi)容是重復的
    我們git pull合并啦C4'和C7

    解決辦法是
git pull --rebase  //代替 git pull
//或者用
git fetch
git rebase teamone/master

得到結(jié)果攒发,所以說某些情況下發(fā)生這種事情调塌,確保團隊別的成員都用git pull --rebase,并且使用rebase的原則是never rebase anything you’ve pushed somewhere.


使用git pull --rebase得到正確結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惠猿,一起剝皮案震驚了整個濱河市羔砾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偶妖,老刑警劉巖姜凄,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趾访,居然都是意外死亡态秧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門扼鞋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來申鱼,“玉大人愤诱,你說我怎么就攤上這事【栌眩” “怎么了淫半?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長楚殿。 經(jīng)常有香客問我撮慨,道長竿痰,這世上最難降的妖魔是什么脆粥? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮影涉,結(jié)果婚禮上变隔,老公的妹妹穿的比我還像新娘。我一直安慰自己蟹倾,他們只是感情好匣缘,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲜棠,像睡著了一般肌厨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豁陆,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天柑爸,我揣著相機與錄音,去河邊找鬼盒音。 笑死表鳍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的祥诽。 我是一名探鬼主播譬圣,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雄坪!你這毒婦竟也來了厘熟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤维哈,失蹤者是張志新(化名)和其女友劉穎绳姨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笨农,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡就缆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谒亦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续镇。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烧栋,靈堂內(nèi)的尸體忽然破棺而出镣陕,到底是詐尸還是另有隱情,我是刑警寧澤博投,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響哼审,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孕豹,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一涩盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧励背,春花似錦春霍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衅疙,卻和暖如春莲趣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饱溢。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工喧伞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人理朋。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓絮识,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嗽上。 傳聞我的和親對象是個殘疾皇子次舌,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,458評論 1 26
  • 本片內(nèi)容轉(zhuǎn)自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃兒閱讀 4,927評論 2 88
  • 恭喜安迪彼念,終于脫單!沒有絲毫意外浅萧,男朋友就是又騷又賤又體貼的小包總逐沙。 安迪是這么向22樓姐妹們介紹小包總的: 是不...
    文琪來啦閱讀 250評論 0 0
  • 我的故鄉(xiāng)外面是黃河,黃河圍起了我的故鄉(xiāng)洼畅。夏天河水蒸騰著沖散暑氣吩案,冬天河水筑起冰殼沉寂了寒冷。河水給了這座小城一個名...
    紅燒茄子黃燜雞閱讀 207評論 0 0
  • 在一個失眠的夜晚帝簇,夜深總是能讓人感性起來徘郭,我和師父道了晚安靠益,卻翻來覆去想事情。 從來沒有想過情緣的我残揉,突然就想要情...
    玉泠泠閱讀 206評論 0 0