Git分支管理
轉(zhuǎn)載
https://www.cnblogs.com/chechen/p/9950798.html
git 基礎(chǔ)命令
添加相關(guān)
git stutas #查看工作區(qū)狀態(tài)
git add #將工作區(qū)修改或新增的文件添加到暫存區(qū)
git commit -m"message" #提交暫存區(qū)的文件
git cherry-pick <commit_id> #如果在dev分支下提交了某些文件(commit_id=c0e345)蛤铜,需要將這次提交的文件合并到master分支,則用git checkout master切換到master分支,再使用git cherry-pick c0e345 將這些在dev分支修改的文件合并到master分支上
文件比較
git diff HEAD -- <file> #將file文件的的工作區(qū)和最新版本的內(nèi)容進(jìn)行比較
git diff <file> #如果文件當(dāng)前在暫存區(qū)擂涛,則將工作區(qū)和暫存區(qū)進(jìn)行對(duì)比。如果當(dāng)前文件未添加到暫存區(qū),則對(duì)比工作區(qū)和版本庫(kù)的內(nèi)容
日志
git log # 顯示從最近到最遠(yuǎn)的提交日志
git log --pretty=oneline #將日志顯示為單行
git reflog #顯示日志 id顯示為前七位
git log --graph # 顯示分支日志圖
版本回退
git reset --hard <version_id> #回退到版本號(hào)為version_id的版本缰贝,此時(shí)HEAD指針會(huì)移動(dòng)到回退的那個(gè)版本
撤銷修改
git checkout -- <file> #把file文件在工作區(qū)的修改全部撤銷,有兩種情況:
#一畔濒、如果該文件已添加到暫存區(qū)剩晴,后有在工作區(qū)做了修改,則執(zhí)行該命令后該文件回退到暫存區(qū)的狀態(tài)
#二侵状、如果該文件自修改后還沒有被放到暫存區(qū)赞弥,現(xiàn)在,撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài)趣兄;
# 注意該命令中的 -- 必須要绽左,否則就變成了切換分支
如果誤刪了某個(gè)文件file,可以用個(gè)git checkout -- file 將文件恢復(fù)回來(lái)且為版本庫(kù)最新版本
git reset HEAD <file> #可以把暫存區(qū)的修改撤銷掉(unstage)艇潭,重新放回工作區(qū)
遠(yuǎn)程倉(cāng)庫(kù)
git remote add origin <remote_git_url> #將本地已有的倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)并命名為origin
git remote remove origin #刪除本地倉(cāng)庫(kù)關(guān)聯(lián)的遠(yuǎn)程倉(cāng)庫(kù)origin
git push -u origin <branch> # 將本地倉(cāng)庫(kù)branch分支推送到遠(yuǎn)程倉(cāng)庫(kù),由于遠(yuǎn)程庫(kù)是空的拼窥,我們第一次推送master分支時(shí),加上了-u參數(shù)蹋凝,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支鲁纠,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái),在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令不用帶-u鳍寂。
git push origin <branch>
git clone git@github.com:dengyw15/gitlearn.git #clone遠(yuǎn)程倉(cāng)庫(kù)到本地
git pull origin <branch> #當(dāng)遠(yuǎn)程倉(cāng)庫(kù)內(nèi)容有修改時(shí)改含,需要將遠(yuǎn)程倉(cāng)庫(kù)的修改拉取到本地
git remote -v #遠(yuǎn)程倉(cāng)庫(kù)的信息
分支管理
git branch -b <branch_name> # 創(chuàng)建并切換到branch_name分支,與git switch -c <branch_name>作用一致迄汛,相當(dāng)于以下兩條命令:
# git branch <branch_name> #切換分支捍壤,也可用git switch <branch_name>
# git checkout <branch_name>
git branch -d <branch_name> # 刪除branch_name分支骤视,如果該分支上還有代碼為提交,可以使用-D參數(shù)強(qiáng)制刪除
git merge <branch_name> # 如果當(dāng)前分支為master鹃觉, git merge dev命令則是將dev分支上面的修改合并到master分支上
git branch --set-upstream-to=origin/dev dev # 建立本地dev分支與遠(yuǎn)程dev分支的連接
# 通常专酗,合并分支時(shí),如果可能帜慢,Git會(huì)用Fast forward模式笼裳,但這種模式下,刪除分支后粱玲,會(huì)丟掉分支信息。如果要強(qiáng)制禁用Fast forward模式拜轨,Git就會(huì)在merge時(shí)生成一個(gè)新的commit抽减,這樣,從分支歷史上就可以看出分支信息橄碾。
git merge --no-ff -m "merge with no-ff" dev #-m參數(shù)后跟合并的描述信息
分支策略
在日常開發(fā)中卵沉,我們對(duì)分支的管理應(yīng)該遵循幾個(gè)原則:
1、master分支應(yīng)該是非常穩(wěn)定的法牲,僅僅用來(lái)發(fā)布新版本史汗,平時(shí)開發(fā)不用這個(gè)分支
2、開發(fā)都在dev分支上拒垃,dev分支是不穩(wěn)定的停撞,比如發(fā)布1.0版本的時(shí)候,dev分支的代碼合并到master分支上悼瓮,通過master分支發(fā)布生產(chǎn)版本
3戈毒、項(xiàng)目成員可以創(chuàng)建自己的分支,完成自己代碼的開發(fā)横堡,功能開發(fā)完成后合并到dev分支上埋市。
最終的分支如下圖:
bug分支
修復(fù)bug時(shí),我們會(huì)通過創(chuàng)建新的bug分支進(jìn)行修復(fù)命贴,然后合并道宅,最后刪除;
當(dāng)手頭工作沒有完成時(shí)胸蛛,先把工作現(xiàn)場(chǎng)git stash一下污茵,然后去修復(fù)bug,修復(fù)后胚泌,再git stash pop省咨,回到工作現(xiàn)場(chǎng);
在master分支上修復(fù)的bug玷室,想要合并到當(dāng)前dev分支零蓉,可以用git cherry-pick <commit>命令笤受,把bug提交的修改“復(fù)制”到當(dāng)前分支,避免重復(fù)勞動(dòng)敌蜂。
feature分支
開發(fā)一個(gè)新功能箩兽,最好新建一個(gè)分支。待功能開發(fā)完成后章喉,切換到原分支上汗贫,并將代碼進(jìn)行合并。
如果要丟棄一個(gè)沒有被合并過代碼的分支秸脱,可以使用git branch -D <branch_name>強(qiáng)行刪除
沖突解決
DYW@DESKTOP-R7AOTTS MINGW64 /f/gitlearn (master)
$ git merge dev # 合并dev分支
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
DYW@DESKTOP-R7AOTTS MINGW64 /f/gitlearn (master|MERGING)
$ vi readme.txt # 手動(dòng)解決沖突
DYW@DESKTOP-R7AOTTS MINGW64 /f/gitlearn (master|MERGING)
$ git add readme.txt
DYW@DESKTOP-R7AOTTS MINGW64 /f/gitlearn (master|MERGING)
$ git commit -m"conflict readme.txt" # 提交沖突
[master 208212c] conflict readme.txt
DYW@DESKTOP-R7AOTTS MINGW64 /f/gitlearn (master)
標(biāo)簽管理
發(fā)布一個(gè)版本時(shí)落包,我們通常先在版本庫(kù)中打一個(gè)標(biāo)簽(tag),這樣摊唇,就唯一確定了打標(biāo)簽時(shí)刻的版本咐蝇。將來(lái)無(wú)論什么時(shí)候,取某個(gè)標(biāo)簽的版本巷查,就是把那個(gè)打標(biāo)簽的時(shí)刻的歷史版本取出來(lái)有序。所以,標(biāo)簽也是版本庫(kù)的一個(gè)快照岛请。commit號(hào)是一串亂七八糟的字符旭寿,通過tag可以更直觀的展示。
標(biāo)簽創(chuàng)建
首先切換到要打標(biāo)簽的分支上面
git tag <name> #打新標(biāo)簽崇败,默認(rèn)標(biāo)簽是打在最新提交的commit上的
git tag <name> <commit_id> # 給歷史提交的commit打標(biāo)簽
git tag -a <name> -m <message> <commit_id> #創(chuàng)建帶有說明信息的標(biāo)簽盅称,name為標(biāo)簽名, message為標(biāo)簽說明
git tag #查看所有標(biāo)簽
git show <tag_name> #顯示某個(gè)tag的具體信息
示例:
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git tag -a v1.0 -m"version 1.0 release"
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git tag
v1.0
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git show v1.0
tag v1.0
Tagger: dengyw15 <ywdenguestc@gmail.com>
Date: Tue Feb 4 12:09:27 2020 +0800
version 1.0 release
commit f27cf058c410d87e7c29658dcb95690a11e670fd (HEAD -> master, tag: v1.0, origin/dev, dev)
Author: dengyw15 <ywdenguestc@gmail.com>
Date: Tue Feb 4 11:49:50 2020 +0800
add local dev
diff --git a/readme.txt b/readme.txt
index eb5a860..50aa283 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2,3 +2,4 @@ this is a readme text.
now add a new line
dfdfsdf
bug issue-101
+local dev
標(biāo)簽管理
git tag -d <name> #本地刪除標(biāo)簽名為name的標(biāo)簽
git push origin <name> #推送標(biāo)簽名為name的標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)
git push origin --tags # 一次性推送全部尚未推送到遠(yuǎn)程倉(cāng)庫(kù)的標(biāo)簽
如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程倉(cāng)庫(kù)僚匆,需要?jiǎng)h除該標(biāo)簽微渠,需要兩步:
git tag -d <name> #本地先刪除該標(biāo)簽
git push origin :refs/tags/<name> # 刪除遠(yuǎn)程標(biāo)簽
示例:
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git tag
v0.9
v1.0
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git push origin v1.0
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 165 bytes | 55.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:dengyw15/gitlearn.git
* [new tag] v1.0 -> v1.0
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To github.com:dengyw15/gitlearn.git
* [new tag] show -> show
* [new tag] v0.9 -> v0.9
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git tag -d v0.9
Deleted tag 'v0.9' (was b356c28)
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (master)
$ git push origin :refs/tags/v0.9
To github.com:dengyw15/gitlearn.git
- [deleted] v0.9
其他操作
git stash #將當(dāng)前工作現(xiàn)場(chǎng)“隱藏”起來(lái),等以后可以回復(fù)現(xiàn)場(chǎng)繼續(xù)工作咧擂。 比如當(dāng)某項(xiàng)工作進(jìn)行到一半逞盆,需要進(jìn)行其他bug修復(fù),此時(shí)可以用該命令將當(dāng)前工作現(xiàn)場(chǎng)先隱藏起來(lái)松申,當(dāng)該bug修復(fù)完成后可以通過下述命令對(duì)現(xiàn)場(chǎng)進(jìn)行恢復(fù)
git stash list #查看當(dāng)前隱藏的工作現(xiàn)場(chǎng)云芦,如:
DYW@NBAIDENGYW01 MINGW64 /h/lab/gitlearn (dev)
$ git stash list
stash@{0}: WIP on dev: e0a1af3 Merge branch 'master' of github.com:dengyw15/gitlearn
要恢復(fù)工作現(xiàn)場(chǎng)有以下兩種方法:
1.git stash apply #恢復(fù)現(xiàn)場(chǎng)后,stash內(nèi)容不會(huì)被刪除贸桶,需要使用git stash drop 來(lái)手動(dòng)刪除
git stash apply stash@{0} #可以恢復(fù)置頂?shù)膕tash
2.git stash pop #恢復(fù)現(xiàn)場(chǎng)后會(huì)自動(dòng)刪除stash內(nèi)容
自定義Git
忽略特殊文件
在Git工作區(qū)的根目錄下創(chuàng)建一個(gè)特殊的.gitignore文件舅逸,然后把要忽略的文件名填進(jìn)去,Git就會(huì)自動(dòng)忽略這些文件皇筛。
不需要從頭寫.gitignore
文件琉历,GitHub已經(jīng)為我們準(zhǔn)備了各種配置文件,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore
忽略文件的原則是:
忽略操作系統(tǒng)自動(dòng)生成的文件旗笔,比如縮略圖等彪置;
忽略編譯生成的中間文件、可執(zhí)行文件等蝇恶,也就是如果一個(gè)文件是通過另一個(gè)文件自動(dòng)生成的拳魁,那自動(dòng)生成的文件就沒必要放進(jìn)版本庫(kù),比如Java編譯產(chǎn)生的.class文件撮弧;
忽略你自己的帶有敏感信息的配置文件潘懊,比如存放口令的配置文件。
git add -f User.class # 如果在ignore文件中忽略了class后綴的文件贿衍,而實(shí)際需要將a.class添加到版本管理授舟,則用該命令強(qiáng)制添加
git check-ignore -v User.class #檢查ignore文件中是哪條配置忽略了User.class
配置別名
多人協(xié)作工作模式
- 如果遠(yuǎn)程倉(cāng)庫(kù)已有工程,則通過git clone <url> 將工程克隆下來(lái)舌厨。
- 通過git push origin <branch> 推送本地修改到遠(yuǎn)程倉(cāng)庫(kù)
- 如果推送失敗岂却,通過git pull origin <branch> 將遠(yuǎn)程倉(cāng)庫(kù)的代碼拉取下來(lái)
- 如果拉取代碼出現(xiàn)沖突,則在本地手工解決沖突裙椭,并在本地提交
- 沒有沖突或沖突解決后,再git push origin <branch> 將修改推送到遠(yuǎn)程倉(cāng)庫(kù)
如果git pull時(shí)提示no tracking information署浩,則說明本地和遠(yuǎn)程分支的鏈接還沒有建立揉燃,則通過git branch --set-upstream-to=origin/<branch_name> <branch_name>建立鏈接