Git 相關(guān)操作

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分支上埋市。
最終的分支如下圖:


image.png

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>建立鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市筋栋,隨后出現(xiàn)的幾起案子炊汤,更是在濱河造成了極大的恐慌,老刑警劉巖弊攘,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抢腐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡襟交,警方通過查閱死者的電腦和手機(jī)迈倍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捣域,“玉大人啼染,你說我怎么就攤上這事』烂罚” “怎么了迹鹅?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贞言。 經(jīng)常有香客問我斜棚,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任弟蚀,我火速辦了婚禮蚤霞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粗梭。我一直安慰自己争便,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布断医。 她就那樣靜靜地躺著滞乙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鉴嗤。 梳的紋絲不亂的頭發(fā)上斩启,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音醉锅,去河邊找鬼兔簇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硬耍,可吹牛的內(nèi)容都是我干的垄琐。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼经柴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狸窘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坯认,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翻擒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牛哺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陋气,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年引润,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巩趁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椰拒,死狀恐怖晶渠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情燃观,我是刑警寧澤褒脯,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站缆毁,受9級(jí)特大地震影響番川,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一颁督、第九天 我趴在偏房一處隱蔽的房頂上張望践啄。 院中可真熱鬧,春花似錦沉御、人聲如沸屿讽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伐谈。三九已至,卻和暖如春试疙,著一層夾襖步出監(jiān)牢的瞬間诵棵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工祝旷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留履澳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓怀跛,卻偏偏與公主長(zhǎng)得像距贷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吻谋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • 常規(guī)操作 git add <file>:提交<file>的更改储耐,-A 提交所有更改,. 提交當(dāng)前路徑下的修改滨溉,<f...
    xiaozhidy閱讀 329評(píng)論 0 1
  • github相關(guān)概念 這里要區(qū)分git和githubgit操作是屬于左半部分,github屬于上面部分git是自己...
    西電大俠閱讀 1,003評(píng)論 1 2
  • 1.在遠(yuǎn)程新建一個(gè)分支以后,在本地clone該分支上的代碼 git clone -b <遠(yuǎn)程倉(cāng)庫(kù)地址> 2.獲...
    Sune小葉子閱讀 762評(píng)論 0 0
  • Today is Thursday. Amelia and her parents were fortunatel...
    Mr_Oldman閱讀 190評(píng)論 0 0
  • 若干年前的今天长赞,我承著父母的期盼來(lái)到這個(gè)世界晦攒,看過了花開花落,走過了春夏秋冬得哆。 轉(zhuǎn)眼間脯颜,在父母的精心呵護(hù)和辛勞付出...
    守望努力幸福閱讀 793評(píng)論 0 0