Git操作詳細(xì)總結(jié)

Git的使用

基礎(chǔ)操作

  • git init 初始化一個倉庫
  • git add readme.txt 添加一個文件到版本控制
  • git commit -m "add a readme file" 提交文件并添加一個說明
  • git status 查看倉庫的當(dāng)前狀態(tài),下面的命令告訴我們,readme文件被修改了领迈,但是還沒有提交钞螟。
PS D:\learngit> git status
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 directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
  • git diff readme.txt 查看具體修改內(nèi)容,13,14行表名了文檔內(nèi)容修改部分
PS D:\learngit> git diff readme.txt

diff --git a/readme.txt b/readme.txt

index d8036c1..7b4104a 100644

--- a/readme.txt

+++ b/readme.txt

@@ -1,2 +1,2 @@

-Git is a version control system.
+Git is a distributed  version control system.

 Git is free software.

\ No newline at end of file
  • git log (--pretty=oneline) 顯示從最近到最遠(yuǎn)的提交日志,一行顯示膜蠢。前面的一長串字母加數(shù)字的組合是SHA1值
PS D:\learngit> git log
commit 7e4d2e7ca2c64acba9d4580112f2d111681ae30e
Author: Sunxin <sunxin0630@gmail.com>
Date:   Wed Jun 28 16:53:17 2017 +0800

    append GPL

commit 8ba42d2299510a66489741269a789e9a3fa31691
Author: Sunxin <sunxin0630@gmail.com>
Date:   Wed Jun 28 16:51:36 2017 +0800

    add distributed

commit 67ae9c91bce5b91e54a722d091f13c1de425b9a3
Author: Sunxin <sunxin0630@gmail.com>
Date:   Wed Jun 28 16:36:25 2017 +0800

    wrote a readme file
    
PS D:\learngit> git log --pretty=oneline
7e4d2e7ca2c64acba9d4580112f2d111681ae30e append GPL
8ba42d2299510a66489741269a789e9a3fa31691 add distributed
67ae9c91bce5b91e54a722d091f13c1de425b9a3 wrote a readme file

版本回退

  • git reset --hard HEAD^ 回退到上一個版本忌愚,在git中HEAD代表當(dāng)前版本誊役,HEAD代表上個版本婿脸,HEAD^代表上上個版本础倍,HEAD是一個指針
PS D:\learngit> git reset --hard HEAD^
HEAD is now at 8ba42d2 add distributed
PS D:\learngit> cat readme.txt
Git is a distributed  version control system.
Git is free software.
  • git reset --hard 7e4d2e7 回退過版本之后又后悔了,想要回去怎么辦徒蟆,只需要記著原來的commit id即可胁出,這樣就可以指定回到未來的某個版本
PS D:\learngit> git reset --hard 7e4d2e7
HEAD is now at 7e4d2e7 append GPL
PS D:\learngit> cat readme.txt
Git is a distributed  version control system.
Git is free software distributed under the GPL.
  • git reflog 想要回到未來卻找不到commit id怎么辦,此命令用來記錄用戶操作的每一次命令,這樣就可以找到每一次操作的commit id了段审。
PS D:\learngit> git reflog
7e4d2e7 HEAD@{0}: reset: moving to 7e4d2e7
8ba42d2 HEAD@{1}: reset: moving to HEAD^
7e4d2e7 HEAD@{2}: commit: append GPL
8ba42d2 HEAD@{3}: commit: add distributed
67ae9c9 HEAD@{4}: commit (initial): wrote a readme file

工作區(qū)和暫存區(qū)

工作區(qū)(Working Directory):能看到的一個目錄

暫存區(qū)(stage):隱藏目錄不算工作區(qū)全蝶,而是版本庫,版本庫中存放著名為stage or index 的暫存區(qū)寺枉,還有g(shù)it自動為我們創(chuàng)建的第一個分支master抑淫,以及指向master的一個指針HEAD

  • git add 是把文件添加進(jìn)去姥闪,實(shí)際上就是把文件修改添加到暫存區(qū)
  • **git commit **提交更改始苇,實(shí)際上就是把暫存區(qū)的文件提交到當(dāng)前分支

管理修改

為什么Git比其他版本控制系統(tǒng)設(shè)計(jì)的優(yōu)秀?因?yàn)間it跟蹤管理的是文件的修改甘畅,而非文件埂蕊。

小結(jié):每次修改,如果不add到暫存區(qū)疏唾,那就不會加入到commit

  • git diff HEAD -- readme.txt 查看工作去和版本庫里面最新版本的區(qū)別

撤銷修改

  • git checkout -- readme.txt 當(dāng)修改了工作區(qū)的某個文件的內(nèi)容蓄氧,想直接丟棄工作區(qū)的修改時使用。
  • git reset HEAD readme.txt 當(dāng)修改了工作區(qū)的某個文件內(nèi)容并且添加到了暫存區(qū)槐脏,使用該命令就可以回到添加暫存區(qū)之前喉童,然后使用第一個命令就可以撤銷修改。
  • 如果已經(jīng)把修改commit顿天,想要撤銷修改堂氯,可以進(jìn)行版本回退,前提是沒有提交遠(yuǎn)程倉庫牌废。

刪除文件

  • 在工作區(qū)刪除了一個已經(jīng)提交到倉庫的文件咽白,可能有兩種情況:

  • 誤刪,這時候就要工作區(qū)和版本庫就不一致了鸟缕,可以把誤刪的文件恢復(fù)

**`git checkout -- test.txt`** 用版本庫里面的版本替換工作區(qū)的版本晶框,一鍵還原
  • 真的想刪除該文件

    git rm test.txt

    git commit -m "remove test.txt"

命令git rm用于刪除一個文件。如果一個文件已經(jīng)被提交到版本庫懂从,那么你永遠(yuǎn)不用擔(dān)心誤刪授段,但是要小心,你只能恢復(fù)文件到最新版本番甩,你會丟失最近一次提交后你修改的內(nèi)容侵贵。


分支管理

使用情景:

? 假設(shè)你準(zhǔn)備開發(fā)一個新功能,但是需要兩周才能完成缘薛,第一周你寫了50%的代碼窍育,如果立刻提交卡睦,由于代碼還沒寫完,不完整的代碼庫會導(dǎo)致別人不能干活了蔫骂。如果等代碼全部寫完再一次提交么翰,又存在丟失每天進(jìn)度的巨大風(fēng)險。現(xiàn)在有了分支辽旋,就不用怕了浩嫌。你創(chuàng)建了一個屬于你自己的分支,別人看不到补胚,還繼續(xù)在原來的分支上正常工作码耐,而你在自己的分支上干活,想提交就提交溶其,直到開發(fā)完畢后骚腥,再一次性合并到原來的分支上,這樣瓶逃,既安全束铭,又不影響別人工作。

分支的切換時使用HEAD指針厢绝,所以git切換分支速度很快契沫。


創(chuàng)建與合并分支

  • git branch 查看分支
  • git branch <name> 創(chuàng)建分支
  • git checkout <name> 切換分支
  • git checkout -b <name> 創(chuàng)建+切換分支
  • git merge <name> 合并某分支到當(dāng)前分支
  • git branch -d <name> 刪除分支

解決沖突

當(dāng)兩個分支修改了文件的同一個地方并且都分別有了新的提交,在這種情況下昔汉,Git無法執(zhí)行“快速合并”懈万,只能試圖把新的提交合并起來,這樣就可能造成沖突靶病。我們必須手動解決沖突之后再提交会通,git status 也可以查看沖突的文件

PS D:\learngit> 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:   readme.txt

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

也可以直接查看源文件

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.
Creating a new branch is quick AND simple.
  • 查看分支合并圖
PS D:\learngit> git log --graph --pretty=oneline --abbrev-commit
*   2b7d8c2 conflict fixed
|\
| * f8cde07 AND simple
* | ec07ee4 & simple
|/
* 0057b61 branch test
* 5fc1cd2 remove test.txt
* e1161a9 add a test file

分支策略

在實(shí)際開發(fā)中,我們應(yīng)該按照幾個基本原則進(jìn)行分支管理:

首先娄周,master分支應(yīng)該是非常穩(wěn)定的涕侈,也就是僅用來發(fā)布新版本,平時不能在上面干活煤辨;

那在哪干活呢驾凶?干活都在dev分支上,也就是說掷酗,dev分支是不穩(wěn)定的,到某個時候窟哺,比如1.0版本發(fā)布時泻轰,再把dev分支合并到master上,在master分支發(fā)布1.0版本且轨;

你和你的小伙伴們每個人都在dev分支上干活浮声,每個人都有自己的分支虚婿,時不時地往dev分支上合并就可以了。

所以泳挥,團(tuán)隊(duì)合作的分支看起來就像這樣:

git-br-policy
git-br-policy
  • 合并分支時然痊,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支屉符,能看出來曾經(jīng)做過合并剧浸,而fast forward合并就看不出來曾經(jīng)做過合并。

Bug分支

修復(fù)bug時矗钟,我們會通過創(chuàng)建新的bug分支進(jìn)行修復(fù)唆香,然后合并,最后刪除吨艇;

當(dāng)手頭工作沒有完成時躬它,先把工作現(xiàn)場git stash一下,然后去修復(fù)bug东涡,修復(fù)后冯吓,再git stash pop,回到工作現(xiàn)場疮跑。

Feature分支

當(dāng)需要開發(fā)一個新功能的時候组贺,最好開一個Feature分支進(jìn)行開發(fā)。在上面開發(fā)完成祸挪,合并锣披,最后刪除Feature分支。

  • git branch -D name丟棄一個沒有被合并過的分支

多人協(xié)作

  • git remote 查看遠(yuǎn)程庫的信息
  • git remote -v 顯示更詳細(xì)的信息
推送分支

把該分支上的所有本地提交推送到遠(yuǎn)程庫贿条。推送時雹仿,要指定本地分支,這樣整以,Git就會把該分支推送到遠(yuǎn)程庫對應(yīng)的遠(yuǎn)程分支上

  • git push origin master
  • git push origin dev
抓取分支
  • git pull 把最新的提交從倉庫中抓取下來

多人協(xié)作的工作模式:

  1. 首先胧辽,可以試圖用git push origin branch-name推送自己的修改;
  2. 如果推送失敗公黑,則因?yàn)檫h(yuǎn)程分支比你的本地更新邑商,需要先用git pull試圖合并;
  3. 如果合并有沖突凡蚜,則解決沖突人断,并在本地提交;
  4. 沒有沖突或者解決掉沖突后朝蜘,再用git push origin branch-name推送就能成功恶迈!

如果git pull提示“no tracking information”,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建谱醇,用命令git branch --set-upstream branch-name origin/branch-name暇仲。


標(biāo)簽管理(tag)

用來為發(fā)布的正式版打上版本號

  • git tag v1.0 在master分支上打tag步做,默認(rèn)tag是打在最新提交的commit上。
  • git tag v0.8 commit id 如果忘了打標(biāo)簽奈附,可以使用commit id找到歷史提交全度,再去打標(biāo)簽。
  PS D:\learngit> git tag v0.9 ac3f8e4
  PS D:\learngit> git tag
  v0.8
  v1.0
  • git show v0.9查看標(biāo)簽信息
  • git tag -a v0.1 -m "version 0.1 released" 67ae9c9 創(chuàng)建一個帶有說明的標(biāo)簽
  • 命令git push origin <tagname>可以推送一個本地標(biāo)簽斥滤;
  • 命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽将鸵;
  • 命令git tag -d <tagname>可以刪除一個本地標(biāo)簽;
  • 命令git push origin :refs/tags/<tagname>可以刪除一個遠(yuǎn)程標(biāo)簽中跌。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咨堤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漩符,更是在濱河造成了極大的恐慌一喘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗜暴,死亡現(xiàn)場離奇詭異凸克,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)闷沥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門萎战,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舆逃,你說我怎么就攤上這事蚂维。” “怎么了路狮?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵虫啥,是天一觀的道長。 經(jīng)常有香客問我奄妨,道長涂籽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任砸抛,我火速辦了婚禮评雌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘直焙。我一直安慰自己景东,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布奔誓。 她就那樣靜靜地躺著斤吐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曲初,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音杯聚,去河邊找鬼臼婆。 笑死赌莺,一個胖子當(dāng)著我的面吹牛吃既,可吹牛的內(nèi)容都是我干的又沾。 我是一名探鬼主播停团,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼韭山,長吁一口氣:“原來是場噩夢啊……” “哼拢驾!你這毒婦竟也來了性置?” 一聲冷哼從身側(cè)響起吨枉,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伪冰,失蹤者是張志新(化名)和其女友劉穎誓酒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贮聂,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靠柑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吓懈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼冰。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耻警,靈堂內(nèi)的尸體忽然破棺而出隔嫡,到底是詐尸還是另有隱情,我是刑警寧澤甘穿,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布腮恩,位于F島的核電站,受9級特大地震影響扒磁,放射性物質(zhì)發(fā)生泄漏庆揪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一妨托、第九天 我趴在偏房一處隱蔽的房頂上張望缸榛。 院中可真熱鬧,春花似錦兰伤、人聲如沸内颗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽均澳。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間找前,已是汗流浹背糟袁。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躺盛,地道東北人项戴。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像槽惫,于是被迫代替她去往敵國和親周叮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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

  • Git是目前最流行的版本管理系統(tǒng)界斜,也是最先進(jìn)的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,717評論 1 17
  • 寫react也快半年了仿耽,講一下自己對于生命周期的理解及各個生命周期的作用 首先,看一下一個組件的構(gòu)造 當(dāng)然前段時間...
    Evan_zhan閱讀 68,828評論 6 51
  • 我自己得過重度抑郁。成為心理咨詢師后得糜,我又接觸了很多抑郁癥患者敬扛。我發(fā)現(xiàn),得抑郁癥的人似乎有一些共同點(diǎn)朝抖,其中最主要的...
    心理師靜怡閱讀 5,847評論 4 3
  • 一個小男孩啥箭,在海邊玩兒,他正醉心于他的沙堡治宣, 卻隱約聽見一個聲音從邊上的水塘傳來急侥,顯然,這個水塘是因?yàn)榇蠛q...
    黎瀞文閱讀 690評論 0 0
  • 身為一名女性侮邀,打從第一次知道“月經(jīng)”坏怪,并被一種來自腹部的深切疼痛包裹起來的時候,我那還未完整的人生觀險些崩塌掉绊茧。 ...
    九月星辰閱讀 333評論 0 0