PS:小白的入門筆記邻奠,希望能有用蚌卤,主要參考廖君Git教程
操作環(huán)境說明:
- github倉(cāng)庫(kù)
https://github.com/zhanghlHUST/figureForMarkdown
周崭,作為名詞說明的示例- 本地工作區(qū)
E:\github\figureForMarkdown
- 操作系統(tǒng) win10 64位
- Github Desktop 3.3.4.0
- Windows PowerShell(x86) 運(yùn)行 Git Shell 作為命令行工具
參考:
廖君Git教程
git pro
圖解Git
知乎-分支操作的一些討論
簡(jiǎn)單粗暴的注意事項(xiàng):
- 使用
git checkout
刪除工作區(qū)修改、撤銷刪除、切換分支時(shí)檩互,一定要注意備份當(dāng)前工作區(qū)的內(nèi)容粹胯,git會(huì)采用倉(cāng)庫(kù)內(nèi)容直接更新工作區(qū)蓖柔,造成工作區(qū)修改的丟失
為什么學(xué) git ?
- 版本控制风纠,git况鸣、CVS 及 SVN 都能做到
- 分布式的合作開發(fā)的控制
- github 的開放的資源
git 的版本控制
工作時(shí)從 版本庫(kù)中提取文件到 工作區(qū)進(jìn)行文件的創(chuàng)建、編輯竹观、修改镐捧、刪除等操作,工作 完成后提交至版本庫(kù)臭增,由版本庫(kù)跟蹤文件的修改歷史懂酱,所有的版本控制系統(tǒng) 只能跟蹤文本文件的改動(dòng),版本控制系統(tǒng)可以告訴你每次的改動(dòng)誊抛,如 txt 文件列牺、網(wǎng)頁、代碼等芍锚。而圖片昔园、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理并炮,但 沒法跟蹤二進(jìn)制文件的變化默刚,只能把二進(jìn)制文件每次改動(dòng)串起來,也就是只知道圖片從100KB改成了120KB逃魄,但到底改了啥荤西,版本控制系統(tǒng)不知道,也沒法知道伍俘。
知識(shí)結(jié)構(gòu)
后續(xù)學(xué)習(xí)任務(wù)
- 結(jié)合《Falsk Web 開發(fā)》對(duì) git 在實(shí)際項(xiàng)目的控制過程進(jìn)行實(shí)戰(zhàn)邪锌,寫成總結(jié)
- github 的正確使用姿勢(shì),寫成總結(jié)
- git 的底層機(jī)制的學(xué)習(xí)癌瘾,特別是
diff
觅丰,checkout
,reset
妨退,branch
妇萄,commit
這幾個(gè)概念的深入理解蜕企,寫成總結(jié)
工作區(qū)及版本庫(kù)的概念

- 工作區(qū): 就是你在電腦里能看到的目錄,即
E:\github\figureForMarkdown
- 版本庫(kù): 工作區(qū)有一個(gè)隱藏目錄.git冠句,即本地的Git的版本庫(kù)轻掩,當(dāng)前倉(cāng)庫(kù)下,如果沒有任何的提交懦底,那么版本庫(kù)就是對(duì)應(yīng)上次提交后的內(nèi)容唇牧。主要包含暫存區(qū)
index
,git自動(dòng)創(chuàng)建的第一個(gè)分支master
以及指向master
的指針HEAD
- 暫存區(qū): git的版本庫(kù)里面最重要的就是稱為
stage
(或index
)的暫存區(qū)聚唐,實(shí)際上就是一個(gè)包含文件索引的目錄樹丐重,像是一個(gè)虛擬的工作區(qū)。在這個(gè)虛擬工作區(qū)的目錄樹中拱层,記錄了文件名弥臼、文件的狀態(tài)信息(時(shí)間戳、文件長(zhǎng)度等)根灯,文件的內(nèi)容并不存儲(chǔ)其中,而是保存在Git對(duì)象庫(kù)(.git/objects)中掺栅,文件索引建立了文件和對(duì)象庫(kù)中對(duì)象實(shí)體之間的對(duì)應(yīng)烙肺。如果當(dāng)前倉(cāng)庫(kù),有文件更新氧卧,并且使用git add命令桃笙,那么這些更新就會(huì)出現(xiàn)在暫存區(qū)中。
操作
創(chuàng)建版本庫(kù)(by shell)
- 首先沙绝,選擇一個(gè)合適的地方搏明,創(chuàng)建一個(gè)空目錄,
mkdir learngit
,cd learngit
,pwd OUTPUT: E:\github\learngit
闪檬,windows系統(tǒng)中各級(jí)目錄名中最好不要使用中文- 通過
git init
將該目錄編程git可以管理的倉(cāng)庫(kù)星著,OUTPUT: Initialized empty Git repository in E:/github/learngit/.git/
,至此倉(cāng)庫(kù)生成目錄下包含.git
目錄用來跟蹤管理版本庫(kù)粗悯。ls -ah
查看隱藏的.git
文件
創(chuàng)建版本庫(kù)(by desktop)
+
->Create
-> 選擇 Name
及local path
-> Create repository
添加文件到版本庫(kù) (by shell)
git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage)虚循,然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支样傍。一旦提交后横缔,如果你又沒有對(duì)工作區(qū)做任何修改,那么工作區(qū)就是“干凈”的衫哥,git status
查看
- 在工作區(qū)
E:\github\learngit
中創(chuàng)建readme.txt
文件茎刚,編輯輸入:
Git is a version control system.
Git is free software.
- 使用
git add readme.txt
添加文件至倉(cāng)庫(kù)(暫存區(qū)index
以及objects
)。沒有輸出表示操作成功撤逢,可反復(fù)多次使用膛锭,可以同時(shí)添加多個(gè)文件拆挥;- 使用
git commit -m 'wrote a readme file'
將文件提交至當(dāng)前分支阁吝,并添加描述信息,會(huì)顯示分支當(dāng)前的狀態(tài)與暫存區(qū)的比較結(jié)果,-m
后為本次提交說明
添加文件到版本庫(kù) (by Desktop)
Desktop沒有先add到暫存區(qū)缺菌,然后commit到分支的概念,文件編輯后洛退,直接查看
changes
查看文件的變化般甲,勾選需要提交的變化,輸入comment summary and descriptipn
提交
修改文件 (by Shell)
git status
命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)俊马。- 工作區(qū)文件與倉(cāng)庫(kù)完全一致時(shí)丁存,
git status
結(jié)果為:
On branch master
nothing to commit, working tree clean
即 沒有待提交內(nèi)容,工作目錄是干凈的
- 工作區(qū)文件改變柴我,如上修改
readme.txt
, 改為Git is a distributed version control system.
,git status
結(jié)果為:
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working dir
modified: reademe.txt
no changes added to commit (use "git add" and/or "git commit -a")
即 文件被修改解寝,但是還未準(zhǔn)備提交修改
- 工作區(qū)文件修改,并
git add
提交至緩存區(qū)艘儒,git status
結(jié)果為:
修改文件 (by Desktop)
與添加文件操作完全一致聋伦,客戶端不嚴(yán)格區(qū)分暫存區(qū)與工作區(qū)
歷史版本的操作
像這樣,你不斷對(duì)文件進(jìn)行修改界睁,然后不斷提交修改到版本庫(kù)里觉增,就好比玩RPG游戲時(shí),每通過一關(guān)就會(huì)自動(dòng)把游戲狀態(tài)存盤翻斟,如果某一關(guān)沒過去逾礁,你還可以選擇讀取前一關(guān)的狀態(tài)。有些時(shí)候访惜,在打Boss之前嘹履,你會(huì)手動(dòng)存盤,以便萬一打Boss失敗了债热,可以從最近的地方重新開始砾嫉。Git也是一樣,每當(dāng)你覺得文件修改到一定程度的時(shí)候阳柔,就可以“保存一個(gè)快照”焰枢,這個(gè)快照在Git中被稱為commit。一旦你把文件改亂了舌剂,或者誤刪了文件济锄,還可以從最近的一個(gè)commit恢復(fù),然后繼續(xù)工作霍转,而不是把幾個(gè)月的工作成果全部丟失荐绝。
查看歷史紀(jì)錄(by Shell)
git log
命令顯示從最近到最遠(yuǎn)的提交日志,可以看到兩次操作,分別是創(chuàng)建文件避消,及修改文件低滩,git log --pretty=online
整理輸出信息
將倉(cāng)庫(kù)撤回到指定版本
首先召夹,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中恕沫,用HEAD表示當(dāng)前版本监憎,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個(gè)版本就是HEAD婶溯,上上一個(gè)版本就是HEAD鲸阔,當(dāng)然往上100個(gè)版本寫100個(gè)比較容易數(shù)不過來,所以寫成HEAD~100迄委。也可以直接使用
git log
顯示的commit
版本號(hào)褐筛,且版本號(hào)沒必要寫全,前幾位就可以了叙身,Git會(huì)自動(dòng)去找渔扎。
git reflog
查看歷史commit的版本號(hào)- 參照廖君Git教程 設(shè)置三次提交
git reset --hard HEAD^
將文件撤回到add distributed
版本,并且git log
查看信轿,add GPL
已經(jīng)消失晃痴,- git的版本撤回是將HEAD指針的指向,并更新工作區(qū)的文件虏两。
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
On branch master
Changes to be committed:
(use "git reset HEAD <file>..."
modified: reademe.txt
即 文件被修改愧旦,待提交
查看文件的對(duì)比區(qū)分
git diff
查看緩存區(qū)與工作區(qū)的文件的改變細(xì)節(jié)。
撤銷修改
撤銷工作區(qū)的修改(by Shell)
- 當(dāng)工作區(qū)的文件修改且該修改并未提交到暫存區(qū)定罢,
git checkout -- file
可以丟棄工作區(qū)的修改- 當(dāng)工作區(qū)的文件修改已經(jīng)提交到暫存區(qū),又做了修改旁瘫,
git checkout -- file
撤銷修改就回到添加到暫存區(qū)后的狀態(tài)祖凫。- 就是讓這個(gè)文件回到最近一次
git commit
或git add
時(shí)的狀態(tài)。git checkout
其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本酬凳,無論工作區(qū)是修改還是刪除惠况,都可以“一鍵還原”
撤銷暫存區(qū)的修改(by Shell)
git reset HEAD file
可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)
撤銷工作區(qū)及暫存區(qū)的修改(by Desktop)
- Destop 并未嚴(yán)格區(qū)分工作區(qū)與暫存區(qū)宁仔,
changes
-> 選擇指定的修改 ->discard changes
撤銷提交到本地版本庫(kù)的修改(by Shell)
- 上文中的將倉(cāng)庫(kù)撤回指定版本的操作稠屠,
git reset --hard 版本號(hào)
撤銷提交到本地版本庫(kù)的修改(by Desktop)
History
-> 選擇指定的提交 ->revert
刪除文件(by Shell)
git rm
相當(dāng)于手動(dòng)刪除文件并提交至?xí)捍鎱^(qū),然后git commit -m "commit"
至本地版本庫(kù)git checkout -- file
恢復(fù)誤刪的文件
刪除文件(by Desktop)
- 手動(dòng)刪除文件 ->
changes
-> 提交修改到版本庫(kù)
本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)

- 遠(yuǎn)程倉(cāng)庫(kù)就是在公網(wǎng)服務(wù)器上的倉(cāng)庫(kù)(repository)翎苫,即
https://github.com/zhanghlHUST/figureForMarkdown
权埠,Git是分布式版本控制系統(tǒng), 同一個(gè)Git倉(cāng)庫(kù)煎谍,可以分布到不同的機(jī)器上攘蔽,找一臺(tái)電腦充當(dāng)服務(wù)器的角色,每天24小時(shí)開機(jī)呐粘,其他每個(gè)人都從這個(gè)“服務(wù)器”倉(cāng)庫(kù)克隆一份到自己的電腦上满俗,并且各自把各自的提交推送到服務(wù)器倉(cāng)庫(kù)里转捕,也從服務(wù)器倉(cāng)庫(kù)中拉取別人的提交。Github用來提供Git倉(cāng)庫(kù)的托管服務(wù)唆垃,注冊(cè)一個(gè)Github賬號(hào)就免費(fèi)獲得Git遠(yuǎn)程倉(cāng)庫(kù)五芝。
操作
設(shè)置 SSH-Key
github官網(wǎng) 頭像下拉 -> Settings
-> SSH and GPG keys
-> SSH keys
創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)
在本地創(chuàng)建了一個(gè)Git倉(cāng)庫(kù)后,可以在GitHub創(chuàng)建一個(gè)Git倉(cāng)庫(kù)辕万,并且讓這兩個(gè)倉(cāng)庫(kù)進(jìn)行遠(yuǎn)程同步枢步,這樣,GitHub上的倉(cāng)庫(kù)既可以作為備份蓄坏,又可以讓其他人通過該倉(cāng)庫(kù)來協(xié)作价捧,github上的倉(cāng)庫(kù)是公開的,可以選擇繳費(fèi)或者自己搭建遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器的方式創(chuàng)建私有的倉(cāng)庫(kù)涡戳。
github官網(wǎng) -> +
-> new repository
-> 輸入Repository name
-> 不要選 Initialize this repository with a README
為本地倉(cāng)庫(kù)添加遠(yuǎn)程倉(cāng)庫(kù)(by Shell)
在本地倉(cāng)庫(kù)運(yùn)行 -> git remote add origin https://github.com/zhanghlHUST/learngit.git
(添加后遠(yuǎn)程庫(kù)的名字是origin)
為本地倉(cāng)庫(kù)添加遠(yuǎn)程倉(cāng)庫(kù)(by Desktop)
右上角Publish
-> 輸入 Name
和 Description
-> 下拉選擇 github 賬號(hào) -> Publish repository
结蟋,之后按鈕 Publish
會(huì)轉(zhuǎn)變成 Sync
推送本地倉(cāng)庫(kù)內(nèi)容到遠(yuǎn)程倉(cāng)庫(kù)(by Shell)
把本地庫(kù)的內(nèi)容推送到遠(yuǎn)程,用
git push
命令渔彰,實(shí)際上是把當(dāng)前分支master推送到遠(yuǎn)程嵌屎。
由于遠(yuǎn)程庫(kù)是空的,我們 第一次推送master分支時(shí)恍涂,加上了-u參數(shù)宝惰,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來再沧,此后尼夺,每次本地提交后,只要有必要炒瘸,就可以使用命令git push origin master推送最新修改
在本地倉(cāng)庫(kù)運(yùn)行 -> git push -u origin master
在本地倉(cāng)庫(kù)運(yùn)行 -> git push origin dev
將 dev
分支推送至遠(yuǎn)程倉(cāng)庫(kù) origin
什么分支需要推送淤堵?
-
master
分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步顷扩,保存程序的發(fā)行版本拐邪。 -
dev
分支是開發(fā)分支,保存程序的主要開發(fā)版本隘截,團(tuán)隊(duì)所有成員都需要在上面工作扎阶,所以也需要與遠(yuǎn)程同步; -
bug
分支只用于在本地修復(fù)bug
婶芭,就沒必要推到遠(yuǎn)程了东臀,除非老板要看看你每周到底修復(fù)了幾個(gè)bug
; -
feature
分支是否推到遠(yuǎn)程雕擂,取決于你是否和你的小伙伴合作在上面開發(fā)啡邑。
推送本地倉(cāng)庫(kù)內(nèi)容到遠(yuǎn)程倉(cāng)庫(kù)(by Desktop)
右上角Sync
,完全同步本地庫(kù)與遠(yuǎn)程庫(kù)井赌,讓兩者保持一致谤逼,功能單一
創(chuàng)建遠(yuǎn)程 orgin
的 dev
分支到本地
git checkout -b dev origin/dev
在dev
分支上協(xié)作開發(fā)贵扰,就必須創(chuàng)建遠(yuǎn)程origin
的dev
分支到本地
從遠(yuǎn)程庫(kù)克隆創(chuàng)建本地倉(cāng)庫(kù)(by Shell)
在本地倉(cāng)庫(kù)運(yùn)行 -> git clone git@github.com:zhanghlHUST/learngit.git
, 當(dāng)從遠(yuǎn)程倉(cāng)庫(kù)克隆時(shí),實(shí)際上Git自動(dòng)把本地的master
分支和遠(yuǎn)程的master
分支對(duì)應(yīng)起來了流部,并且戚绕,遠(yuǎn)程倉(cāng)庫(kù)的默認(rèn)名稱是origin
從遠(yuǎn)程庫(kù)克隆創(chuàng)建本地倉(cāng)庫(kù)(by Desktop)
+
-> Clone
-> 選擇 repository -> Clone repositoty
-> 選擇本地倉(cāng)庫(kù)目錄
查看遠(yuǎn)程庫(kù)的信息 (by Shell)
git remote
, git remote -v
查看遠(yuǎn)程庫(kù)的詳細(xì)信息
合作開發(fā)的控制
分支的概念
引用 Git 分支 - 利用分支進(jìn)行開發(fā)的工作流程
- 合作開發(fā)的控制: 可以同時(shí)擁有多個(gè)開放的分支,每個(gè)分支用于完成特定的任務(wù)枝冀,隨著開發(fā)的推進(jìn)舞丛,可以隨時(shí)把某個(gè)特性分支的成果并到其他分支中。

- 維護(hù)不同程度的穩(wěn)定性:通常在
master
分支中保留完全穩(wěn)定的代碼(通常是已經(jīng)發(fā)布或者即將發(fā)布的代碼)果漾,與此同時(shí)還有一個(gè)名為master
或者next
的分支 專門用于后續(xù)的開發(fā)或者測(cè)試球切,當(dāng)next
的新特性一旦進(jìn)入某種穩(wěn)定狀態(tài),就可以將新特性合并到master
绒障,同樣設(shè)置 針對(duì)具體問題的特性分支(短期分支)topic
吨凑,在確保指定特性分支能夠通過所有測(cè)試之后將其合并到主干分支,等待后續(xù)的發(fā)布户辱。

- 如上圖由下往上鸵钝,起先我們?cè)?
master
工作到C1
,然后開始一個(gè)新分支iss91
嘗試修復(fù) 91 號(hào)缺陷庐镐,提交到C6
的時(shí)候恩商,又冒出一個(gè)解決該問題的新辦法,于是從之前C4
的地方又分出一個(gè)分支iss91v2
必逆,干到C8
的時(shí)候怠堪,又回到主干master
中提交了C9
和C10
,再回到iss91v2
繼續(xù)工作名眉,提交C11
研叫,接著,又冒出個(gè)不太確定的想法璧针,從master
的最新提交C10
處開了個(gè)新的分支dumbidea
做些試驗(yàn)。現(xiàn)在渊啰,假定兩件事情:我們最終決定使用第二個(gè)解決方案探橱,即iss91v2
中的辦法;另外绘证,我們把dumbidea
分支拿給同事們看了以后隧膏,發(fā)現(xiàn)它竟然是個(gè)天才之作。所以接下來嚷那,我們準(zhǔn)備拋棄原來的iss91
分支(實(shí)際上會(huì)丟棄C5
和C6
)胞枕,直接在主干中并入另外兩個(gè)分支
分支合并結(jié)果
- 特性分支 在任何規(guī)模的項(xiàng)目中都可以使用特性分支。一個(gè)特性分支是指一個(gè)短期的魏宽,用來實(shí)現(xiàn)單一特性或與其相關(guān)工作的分支腐泻,該技術(shù)允許你迅速且完全的進(jìn)行語境切換决乎,工作將分散在不同的流水線上,每個(gè)分支都有特定的目標(biāo)特性派桩。
操作
創(chuàng)建分支(by Shell)
git branch dev
創(chuàng)建分支dev
构诚,無輸出
創(chuàng)建分支(by Desktop)
點(diǎn)擊branch前的分支按鈕 -> 輸入 Name
-> 選擇 From branch
-> Create new branch
切換分支(by Shell)
從當(dāng)前的提交之后創(chuàng)建分支
git checkout dev
切換到分支dev
,輸出 Switched to branch 'dev'
git checkout -b dev
創(chuàng)建并切換到 dev
分支铆惑,輸出 Switched to a new branch 'dev'
切換分支(by Desktop)
點(diǎn)擊當(dāng)前分支名稱旁的下拉按鈕范嘱,選擇分支
不同分支的內(nèi)容的可見性(by Shell)
不同的分支管理不同的commit
,commit
之間通過地址單向訪問,繼而限制了不同分支的可見性员魏,git checkout branchName
切換到不同分支之后丑蛤,工作區(qū)的文件內(nèi)容會(huì)自動(dòng)更新。注意備份工作區(qū)的修改
查看分支(by Shell)
git branch
查看分支列表
合并分支(by Shell)
將dev
并入master
- 切換到
master
分支撕阎,git checkout master
- 合并
dev
分支到當(dāng)前分支受裹,git merge dev
合并分支(by Desktop)
切換到 master
-> compare
-> 選取待合并的目標(biāo)分支 -> update from target branch
合并方式
-
Fast-forward
,“快進(jìn)模式”闻书,也就是直接把master指向dev的當(dāng)前提交名斟,所以合并速度非常快
合并沖突
設(shè)想情景魄眉,在
commit n
之后創(chuàng)建分支dev
砰盐,提交修改commit n+1
,切換到master
分支坑律,提交修改commit n+2
岩梳,然后試圖將dev
分支合并到master
時(shí)出現(xiàn)沖突,輸出Auto-merging README.md \n CONFLICT (content): Merge conflict in README.md \n Automatic merge failed; fix conflicts and then commit the result.
輸出:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
其中晃择,Git用<<<<<<<
冀值,=======
,>>>>>>>
標(biāo)記出不同分支的內(nèi)容宫屠。
- 直接對(duì)沖突的文件進(jìn)行修改列疗,刪除不同分支沖突的內(nèi)容。
- 在
master
分支提交修改浪蹂。 -
git log --graph --pretty=oneline --abbrev-commit
查看分支的合并情況
刪除分支 (by Shell)
git branch -d dev
刪除分支 dev
刪除分支 (by desktop)
切換到目標(biāo)分支 -> 右上角齒輪狀設(shè)置按鈕 -> Delete target_branch ...
查看分支合并情況 (by Shell)
git log --graph --pretty=oneline --abbrev-commit
查看分支的合并情況及相應(yīng)的提交
git 分支管理策略
團(tuán)隊(duì)合作分支策略

- 首先抵栈,
master
分支應(yīng)該非常穩(wěn)定,僅用來發(fā)布新版本坤次,平時(shí)不能在上面干活古劲;- 干活都在
dev
分支上,即dev
時(shí)不太穩(wěn)定的缰猴,更超前的产艾;- 不同的開發(fā)人員在不同的分支上進(jìn)行開發(fā),然后將性能穩(wěn)定的版本合并至
dev
版本上。
bug
分支及當(dāng)前分支工作的stash
儲(chǔ)藏功能
- 情景 軟件開發(fā)中遇到
bug
時(shí)闷堡,每個(gè)bug都可以通過一個(gè)新的臨時(shí)分支來修復(fù)隘膘,修復(fù)后,合并分支缚窿,然后將臨時(shí)分支刪除棘幸。比如當(dāng)你接到一個(gè)修復(fù)一個(gè)代號(hào)101
的bug
的任務(wù)時(shí),很自然地倦零,你想創(chuàng)建一個(gè)分支issue-101
來修復(fù)它误续,但是,假如當(dāng)前正在dev上進(jìn)行的工作還沒有提交扫茅,并且當(dāng)前的工作仍在進(jìn)行中蹋嵌,不能提交,然而創(chuàng)建分支修改bug又勢(shì)在必行葫隙。此時(shí)創(chuàng)建分支修改bug
后提交修改時(shí)栽烂,會(huì)將dev
的內(nèi)容同時(shí)提交。此時(shí)需要stash
保存工作現(xiàn)場(chǎng)恋脚。
操作
創(chuàng)建commit的合并方式 (by Shell)
合并分支時(shí)腺办,Git會(huì)盡可能采用
Fast forward
模式,在這種模式下糟描,刪除分支后怀喉,會(huì)丟掉分支信息。如果強(qiáng)行禁用Fast forward
模式船响,Git就會(huì)在merge
時(shí)生成一個(gè)新的commit
, 這樣分支歷史就可以看出分支信息躬拢。
工作現(xiàn)場(chǎng)stash
的使用 (by Shell)
當(dāng)工作區(qū)的目標(biāo)不適合提交(正在開發(fā)或者是臟的提交)時(shí),使用
stash
保存快照见间,并進(jìn)行恢復(fù)聊闯,不過stash
只保存改變的需要被跟蹤的文件,其他文件不會(huì)被跟蹤米诉×馐撸恢復(fù)stash
時(shí),若跟蹤的文件被修改史侣,會(huì)遇到?jīng)_突汗销。
-
git stash
保存工作現(xiàn)場(chǎng),此時(shí)git status
查看工作區(qū)沒有修改信息 -
git stash list
查看工作現(xiàn)場(chǎng)的列表 -
git stash apply stash@{id}
恢復(fù)stash@{id}
的內(nèi)容,git stash drop
刪除工作現(xiàn)場(chǎng) -
git stash pop stash@{id}
恢復(fù)stash@{id}
的內(nèi)容同時(shí)刪除它
git merge --no-ff -m "merge message" dev
合并分支并提交merge
信息
強(qiáng)行丟棄分支
git branch -D <name>
可以強(qiáng)行刪除未合并到主分支的特性分支
多人協(xié)作的工作方式
當(dāng)有沖突的時(shí)候抵窒,先用
git pull
把最新的提交從origin/dev
抓下來,然后在本地合并叠骑,解決沖突李皇,再推送
- 首先,可以試圖用
git push origin branch-name
推送自己的修改; - 如果推送失敗掉房,則因?yàn)檫h(yuǎn)程分支比你的本地更新茧跋,需要先用
git pull
抓取遠(yuǎn)程倉(cāng)庫(kù)的最新更新; - 如果
git pull
提示“no tracking information”
卓囚,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建瘾杭,指定本地dev
與origin/dev
分支的鏈接,git branch --set-upstream dev origin/dev
- 然后本地的倉(cāng)庫(kù)中出現(xiàn)沖突哪亿,需要手動(dòng)解決粥烁,解決方式與分制管理中的解決沖突的方式一致。解決沖突提交到本地倉(cāng)庫(kù)蝇棉,
- 推送到遠(yuǎn)程倉(cāng)庫(kù)
git push origin dev
標(biāo)簽管理
tag就是一個(gè)讓人容易記住的有意義的名字讨阻,它跟某個(gè)commit綁在一起,一般給程序的不同版本設(shè)置標(biāo)簽篡殷,便于快速查找
操作
創(chuàng)建標(biāo)簽 (by Shell)
- 切換到需要打標(biāo)簽的分支上
git checkout <branch name>
- 創(chuàng)建標(biāo)簽
git tag <name>
對(duì)最新的提交打標(biāo)簽 - 創(chuàng)建標(biāo)簽
git tag <tag name> <commit id>
給指定提交打標(biāo)簽 - 創(chuàng)建有說明信息的標(biāo)簽
git tag -a <tagname> -m "tag message" <commit id>
查看所簽 (by Shell)
- 列出所有標(biāo)簽
git tag
钝吮, 標(biāo)簽的順序是字母順序,而不是時(shí)間順序 - 查看標(biāo)簽的詳細(xì)信息
git show <tagname>
刪除標(biāo)簽 (by Shell)
- 刪除本地倉(cāng)庫(kù)標(biāo)簽
git tag -d <tag name>
- 刪除遠(yuǎn)程倉(cāng)庫(kù)的標(biāo)簽, 先刪除本地標(biāo)簽
git tag -d <tag name>
板辽,然后刪除遠(yuǎn)程的標(biāo)簽git push origin :refs/tags/v0.9
推送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù) (by Shell)
- 推送單個(gè)標(biāo)簽
git push <branch name> <tag name>
- 一次性推送多個(gè)標(biāo)簽
git push origin --tags