Git命令(圖文版+idea版本)

導(dǎo)言

git之所以復(fù)雜,是維護(hù)了本地分支,本地主干。遠(yuǎn)程分支,遠(yuǎn)程主干,以及工作區(qū)和暫存區(qū)之間的關(guān)系。

  • 工作區(qū):在idea中實(shí)際上是創(chuàng)建文件,但未add,此時(shí)文件是紅色的。
  • 暫存區(qū):在idea中文件進(jìn)行add,但是沒有commit,此時(shí)文件是綠色的
  • 分支/主干:在idea中進(jìn)行commit,此時(shí)文件是白色的。

在本地中,因?yàn)槭枪昧艘惶状a,兩個(gè)分支,所以工作區(qū)和暫存區(qū)的內(nèi)容在各個(gè)分支中是共享的。

但若是代碼提交到分支上,那么主干上看不到提交到分支的代碼。實(shí)際上主干和分支是兩個(gè)指針。若是分支代碼版本是新的,那么如下圖所示:

image

我們?nèi)鬰heckout(切換分支)到master,是看不到dev最新commit的代碼的。

而實(shí)際上我們合并分支時(shí),只是將master指針指向dev節(jié)點(diǎn)上,完成了快速合并。(故在dev分支上進(jìn)行merge(合并))

注:合并分支時(shí),項(xiàng)目中 不能存在 只add(即idea綠色文件)的文件。

理論

每次提交Git都把它們串成一條時(shí)間線,這條時(shí)間線就是一個(gè)分支截止到目前,只有一條時(shí)間線,在Git里,這個(gè)分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。

上面的是什么意思呢?
每次提交,master分支都會(huì)向前移動(dòng)一步,這樣,隨著你不斷提交,master分支的線也越來越長(zhǎng)

image.png

當(dāng)我們創(chuàng)建新的分支,例如dev時(shí),Git新建了一個(gè)指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當(dāng)前分支在dev上:

image

不過,從現(xiàn)在開始,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后,dev指針往前移動(dòng)一步,而master指針不變:

image

假如我們?cè)?code>dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最簡(jiǎn)單的方法,就是直接把master指向dev的當(dāng)前提交,就完成了合并:

image

所以Git合并分支也很快!就改改指針,工作區(qū)內(nèi)容也不變!

合并完分支后,甚至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了一條master分支:

image

真是太神奇了,你看得出來有些提交是通過分支完成的嗎?

1. 文件初創(chuàng)

1.1. 新建文件

image.png

1.2、查詢文件狀態(tài)

命令:git status

image.png

1.3. 將文件保存到暫存區(qū)

命令:git add 文件名,再次使用git status查詢狀態(tài)。

image.png

1.4.將文件保存到當(dāng)前分支(本地倉(cāng)庫(kù))

命令:git commit -m '注釋'

image.png

1.5. 查詢文件修改的內(nèi)容

命令:git diff 文件名

image.png

使用git status查詢狀態(tài),使用git diff 文件名 查詢差異。

git提交文件只要兩步:

  1. 使用 git add 把文件添加進(jìn)去,實(shí)際上就是把文件(工作區(qū))添加到暫存區(qū)
  2. 使用git commit提交更改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支上。
git的工作流程.png

2. 文件回退

2.1. 查詢分支日志

命令:git log 可以查詢當(dāng)前分支的提交日志??梢允褂?code>q退出。

image.png

2.2. 分支回退版本

命令:git reset --hard HEAD^ 那么如果要回退到上上個(gè)版本只需把HEAD^ 改成 HEAD^^。是將當(dāng)前分支上的文件回退一個(gè)版本。
回退git reset --hard HEAD是回退暫存區(qū)的文件。

image.png

2.3. 獲取版本號(hào)

命令:git reflog若是我們將客戶窗口關(guān)閉(git log命令失效),或者回退到某個(gè)版本。那么需要該命令獲取版本號(hào)。

image.png

2.4. 分支回退指定版本

命令:git reset --hard 版本號(hào)(注意無空格)

image.png

2.5. 文件撤銷

命令:git checkout -- 文件名【注意有空格,注意 -- 】

需要注意的是:

  1. add命令,可以還原;
  2. 已經(jīng)執(zhí)行git add命令,無論是否被commit無法還原;
image.png

總結(jié):文件恢復(fù)的辦法:
第一:如果我知道要?jiǎng)h掉那些內(nèi)容的話,直接手動(dòng)更改去掉那些需要的文件,然后add添加到暫存區(qū),最后commit掉。
第二:我可以按以前的方法直接恢復(fù)到上一個(gè)版本。使用 git reset --hard HEAD^;或者git reset --hard 版本號(hào)(注意無空格)。__
第三git checkout -- 文件名,可以將工作區(qū)還原。


3. 文件刪除

將文件手動(dòng)刪除之后,使用git status查詢狀態(tài):

image.png

此時(shí),有兩種策略:(1)文件還原;(2)文件在當(dāng)前分支上刪除;

3.1 文件還原

命令:git checkout -- 文件名,因?yàn)橹皇窃?strong>工作區(qū)做出的修改,所以可以撤銷操作。

image.png

3.2 分支上刪除

命令:先執(zhí)行add命令,而后執(zhí)行commit命令。

執(zhí)行add命令后不能撤銷刪除.png

文件在分支上刪除.png


4. 分支的創(chuàng)建和合并

4.1 分支的創(chuàng)建

git checkout 命令加上 –b參數(shù),表示創(chuàng)建并切換,相當(dāng)于如下2條命令
  git branch dev (創(chuàng)建分支)
  git checkout dev(切換分支)
git branch(查看所有分支):

創(chuàng)建并切換分支.png

4.2 多分支之間操作

dev分支上修改TestSort.java文件,使用git diff 文件名命令查詢差異。

修改TestSort.java文件.png

add+commit命令將工作區(qū)文件合并到dev分支上。

將修改文件合并到dev分支.png

切換分支:命令:git checkout 分支名。并未在當(dāng)前分支上查詢到修改的信息。

分支切換后內(nèi)容消失.png

4.3 分支合并

命令git merge -d 分支A。將分支A合并到當(dāng)前分支。

Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把fenzhi1指向dev的當(dāng)前提交,所以合并速度非?????梢圆榭次募?,已經(jīng)含有了dev分支的修改內(nèi)容。

多分支合并.png

4.4 分支刪除

命令git branch -d 分支A。將分支A刪除。

分支刪除.png

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


5. 分支沖突

5.1 沖突的產(chǎn)生

dev分支上,對(duì)TestSort.java文件進(jìn)行修改。然后提交到當(dāng)前分支。

dev分支上合并操作.png

通過命令:git checkout 分支名 切換分支后,查看分支內(nèi)容。

fenzhi1上并無修改內(nèi)容.png

master分支上修改同一個(gè)文件,然后提交到分支上。

在fenzhi1分支修改同一個(gè)文件.png

以上是合并沖突的準(zhǔn)備工作
此時(shí),在將dev分支上代碼合并到主干(master)上時(shí),出現(xiàn)版本沖突。

合并沖突.png

于是我們開始檢查沖突的代碼:Git用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容,其中<<<HEAD是指主分支修改的內(nèi)容,>>>>>dev是指dev上修改的內(nèi)容。

檢查沖突代碼.png

我們修改沖突代碼后,將其重新放入暫存區(qū),然后提交到master主干上。

解決沖突.png

通常合并分支時(shí),git一般使用”Fast forward”模式,在這種模式下,刪除分支后,會(huì)丟掉分支信息,現(xiàn)在我們來使用帶參數(shù) –no-ff來禁用”Fast forward”模式。首先我們來做demo演示下:

  1. 創(chuàng)建一個(gè)dev分支。
  2. 修改readme.txt內(nèi)容。
  3. 添加到暫存區(qū)。
  4. 切換回主分支(master)。
  5. 合并dev分支,使用命令 git merge –no-ff -m “注釋” dev
  6. 查看歷史記錄
切換分支
合并并刪除分支.png
查詢分支日志.png

分支策略:首先master主分支應(yīng)該是非常穩(wěn)定的,也就是用來發(fā)布新版本,一般情況下不允許在上面干活,干活一般情況下在新建的dev分支上干活,干完后,比如上要發(fā)布,或者說dev分支代碼穩(wěn)定后可以合并到主分支master上來。


6. (精華)多人協(xié)作

當(dāng)你從遠(yuǎn)程庫(kù)克隆時(shí)候,實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來了,并且遠(yuǎn)程庫(kù)的默認(rèn)名稱是origin。

6.1 查詢遠(yuǎn)程倉(cāng)庫(kù)

要查看遠(yuǎn)程庫(kù)的信息 使用 git remote
要查看遠(yuǎn)程庫(kù)的詳細(xì)信息 使用 git remote –v

查看遠(yuǎn)程庫(kù)的信息.png

6.2 數(shù)據(jù)推送

命令:git push 遠(yuǎn)程服務(wù)器名 遠(yuǎn)程分支名,將信息push到遠(yuǎn)程倉(cāng)庫(kù)。

image.png

那么一般情況下,那些分支要推送呢?
master分支是主分支,因此要時(shí)刻與遠(yuǎn)程同步。
一些修復(fù)bug分支不需要推送到遠(yuǎn)程去,可以先合并到主分支上,然后把主分支master推送到遠(yuǎn)程去。

6.3 抓取分支:

命令:git push origin dev小胖將信息push到遠(yuǎn)程dev分支上

用戶A將信息push到遠(yuǎn)程dev分支上.png

小伙伴要在dev分支上做開發(fā),就必須把遠(yuǎn)程的origin的dev分支到本地來,于是可以使用命令創(chuàng)建本地dev分支:git checkout –b dev origin/dev
現(xiàn)在小伙伴們就可以在dev分支上做開發(fā)了,開發(fā)完成后把dev分支推送到遠(yuǎn)程庫(kù)。

將遠(yuǎn)程分支拉到本地.png

小胖將TestSort.java修改的內(nèi)容推送到遠(yuǎn)程。

image.png

小悠也想對(duì)TestSort.java這個(gè)文件信息修改。于是:

image.png

由上面可知:推送失敗,因?yàn)槲业男』锇樽钚绿峤坏暮臀以噲D推送的有沖突,解決的辦法也很簡(jiǎn)單,上面已經(jīng)提示我們,先用git pull把最新的提交從origin/dev抓下來,然后在本地合并,(手動(dòng))解決沖突,再推送。

因此:多人協(xié)作工作模式一般是這樣的:
首先,可以試圖用git push origin branch-name推送自己的修改;
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新早,需要先用git pull試圖合并。
如果合并有沖突,則需要解決沖突,并在本地提交。再用git push origin branch-name推送。

7. 應(yīng)用實(shí)戰(zhàn)(idea版本)

7.1 idea文件和git版本的關(guān)系

idea文件的顏色和版本的關(guān)系

7.2 場(chǎng)景1

git使用場(chǎng)景:

開發(fā)過程中,忘記將主干上的代碼pull(遠(yuǎn)程分支下拉命令)或者merge(本地主干下拉命令)。且開發(fā)到一半時(shí)(已存在大量“藍(lán)色/綠色”文件),此時(shí)再想pull或者merge時(shí)候。出現(xiàn)
下拉代碼的異常

解決方案1:

如果你想保留剛才本地修改的代碼,并把git服務(wù)器上的代碼pull到本地(本地剛才修改的代碼將會(huì)被暫時(shí)封存起來)
git stash
git pull origin master
git stash pop

等價(jià)于git stash,將修改代碼保存起來
這個(gè)是將本地主干代碼拉取到本地分支(相當(dāng)與遠(yuǎn)程服務(wù)器拉取的git pull origin master命令)
拉取完畢,恢復(fù)存儲(chǔ)的改變,可能后續(xù)存在解決沖突的問題

解決方案2:

如果你想完全地覆蓋本地的代碼,只保留服務(wù)器端代碼,則直接回退到上一個(gè)版本,再進(jìn)行pull:
git reset --hard
git pull origin master

文章參考:https://www.cnblogs.com/replaceroot/p/9825760.html
     http://www.admin10000.com/document/5374.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,870評(píng)論 1 26
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,852評(píng)論 9 163
  • Git常用語法 [TOC] Git簡(jiǎn)介 描述 ? Git(讀音為/g?t/。)是一個(gè)開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,937評(píng)論 0 13
  • 以下筆記主要參考gitgot,大致了解git使用和原理。 第一部分我們從個(gè)人的視角去研究如何用好Git,并且揭示G...
    carolwhite閱讀 2,523評(píng)論 0 1
  • 今天的晨讀感悟似乎會(huì)寫但又不知道怎么寫了,會(huì)寫是因?yàn)閺哪莻€(gè)青春不羈的性格中體會(huì)了點(diǎn)點(diǎn)滴滴的從單身到脫單再到單身的幕...
    faye26閱讀 319評(píng)論 2 3

友情鏈接更多精彩內(nèi)容