我先開一會(huì)兒吐槽大會(huì),從大四進(jìn)課題組做科研開始,Git 這東西我用了一年,根本用不明白。
我搞不明白的一個(gè)重要原因就是,命令的功能太雜,有時(shí)候一個(gè)需求可以用好幾種命令解決,而且有的命令還 tm 有別名。這導(dǎo)致什么問題呢,我在網(wǎng)上找到的答案五花八門,竟然都能達(dá)成目的,難以找到規(guī)律,毫無(wú)套路可言。
以前我用 Git,就知道 add .,然后 commit -m,最后 push origin master 一套帶走,或者就是把 Git 作為下載器,去 clone 別人的項(xiàng)目。可是在日常項(xiàng)目使用過程中經(jīng)常遇到因?yàn)槭謿埌汛a弄錯(cuò)了需要恢復(fù)到原來(lái)的版本的問題,對(duì)于git的學(xué)習(xí),我的經(jīng)驗(yàn)是,一是投入實(shí)踐,二是化復(fù)雜為簡(jiǎn)單。
所以本文不是一個(gè)大而全 Git 命令的使用手冊(cè),而是根據(jù)實(shí)際工作中最常見問題,提供小而美的解決方案,僅僅涉及四個(gè)命令:add,commit,reset,checkout。
遠(yuǎn)程倉(cāng)庫(kù)涉及的三個(gè)命令:fetch,pull,clone
首先,在進(jìn)入 Git 的各種操作之前,一定要明白 git 的三個(gè)「分區(qū)」是什么,否則的話你一定沒辦法真正理解 Git 的原理。Git 的三個(gè)分區(qū)分別是:working directory,stage/index area,commit history。
working directory是「工作目錄」,也就是我們?nèi)庋勰軌蚩吹降奈募?,后文我們稱其為work dir區(qū)。
當(dāng)我們?cè)?mark>work dir中執(zhí)行git add相關(guān)命令后,就會(huì)把work dir中的修改添加到「暫存區(qū)」stage area(或者叫index area)中去,后文我們稱暫存區(qū)為stage區(qū)。
當(dāng)stage中存在修改時(shí),我們使用git commit相關(guān)命令之后,就會(huì)把stage中的修改保存到「提交歷史」commit history中,也就是HEAD指針指向的位置。后文我們稱「提交歷史」為history區(qū)。
關(guān)于 commit history 我們多說幾句,任何修改只要進(jìn)入 commit history,基本可以認(rèn)為永遠(yuǎn)不會(huì)丟失了。每個(gè) commit 都有一個(gè)唯一的 Hash 值,我們經(jīng)常說的 HEAD 或者 master 分支,都可以理解為一個(gè)指向某個(gè) commit 的指針。
work dir 和 stage 區(qū)域的狀態(tài),可以通過命令 git status 來(lái)查看,history 區(qū)域的提交歷史可以通過 git log 命令來(lái)查看。
好的,如果上面的內(nèi)容你都能夠理解,那么本文就完全圍繞這三個(gè)概念展開,下面就是一個(gè)關(guān)系圖:
$ touch test1.txt test2.txt
$ git add .
$ git status
On branch master
Changes to be committed:
new file: test1.txt
new file: test2.txt
然后我又修改了test1.txt文件。
$ echo hello world >>test1.txt
$ git status
On branch master
Changes to be committed:
new file: test1.txt
new file: test2.txt
Changes not staged for commit:
modified: test1.txt
現(xiàn)在,我后悔了,我認(rèn)為不應(yīng)該修改 test1.txt,我想把它還原成 stage中的空文件,怎么辦?
答案是,使用 checkout 命令:
$ git checkout test1.txt
Updated 1 path from the index
$ git status
On branch master
Changes to be committed:
new file: test1.txt
new file: test2.txt
輸出顯示從index區(qū)(也就是== stage == 區(qū))更新了一個(gè)文件,也就是把work dir中 test1.txt 文件還原成了stage中的狀態(tài)(一個(gè)空文件)。
當(dāng)然,如果work dir中被修改的文件很多,可以使用通配符全部恢復(fù)成stage:
git checkout *
有一點(diǎn)需要指出的是,checkout 命令只會(huì)把被「修改」的文件恢復(fù)成 stage 的狀態(tài),如果 work dir 中新增了新文件,你使用 git checkout . 是不會(huì)刪除新文件的。
$ git commit -m '一些描述'
再簡(jiǎn)單提一些常見場(chǎng)景, 比如說 commit 完之后,突然發(fā)現(xiàn)一些錯(cuò)別字需要修改,又不想為改幾個(gè)錯(cuò)別字而新開一個(gè) commit 到 history 區(qū),那么就可以使用下面這個(gè)命令:
$ git commit --amend
這樣就是把錯(cuò)別字的修改和之前的那個(gè) commit 中的修改合并,作為一個(gè) commit 提交到 history 區(qū)。
這個(gè)需求很常見,比如說我用了一個(gè) git add . 一股腦把所有修改加入 stage,但是突然想起來(lái)文件 test1.txt 中的代碼我還沒寫完,不應(yīng)該把它 commit 到 history 區(qū),所以我得把它從 stage 中撤銷,等后面我寫完了再提交。
$ echo aaa >>test1.txt; echo bbb >>test2.txt;
$ git add .
$ git status
On branch master
Changes to be committed:
modified: test1.txt
modified: test2.txt
如何把 test1.txt 從 stage 區(qū)還原出來(lái)呢?可以使用 git reset 命令:
$ git reset test1.txt
$ git status
On branch master
Changes to be committed:
modified: test2.txt
Changes not staged for commit:
modified: test1.txt
你看,這樣就可以把== test1.txt == 文件從 stage 區(qū)移出,這時(shí)候進(jìn)行git commit相關(guān)的操作就不會(huì)把這個(gè)文件一起提交到 history 區(qū)了。
上面的這個(gè)命令是一個(gè)簡(jiǎn)寫,實(shí)際上 reset 命令的完整寫法如下:
$ git reset --mixed HEAD test1.txt
其中,mixed是一個(gè)模式(mode)參數(shù),如果 reset 省略這個(gè)選項(xiàng)的話默認(rèn)是 mixed 模式;HEAD指定了一個(gè)歷史提交的 hash 值;test1.txt 指定了一個(gè)或者多個(gè)文件。
該命令的自然語(yǔ)言描述是:不改變 work dir 中的任何數(shù)據(jù),將 stage 區(qū)域中的 a.txt 文件還原成 HEAD 指向的 commit history 中的樣子。就相當(dāng)于把對(duì) a.txt 的修改從 stage 區(qū)撤銷,但依然保存在 work dir 中,變?yōu)?unstage 的狀態(tài)。
依然是使用 checkout 命令,但是和之前的使用方式有一些不同:
$ git checkout HEAD .
Updated 12 paths from d480c4f
這樣,work dir和stage中所有的「修改」都會(huì)被撤銷,恢復(fù)成HEAD指向的那個(gè)history commit。
注意,類似之前通過stage恢復(fù)work dir的checkout命令,這里撤銷的也只是修改,新增的文件不會(huì)被撤銷。
當(dāng)然,只要找到任意一個(gè) commit 的 HASH 值,checkout 命令可就以將文件恢復(fù)成任一個(gè) history commit 中的樣子。
建議謹(jǐn)慎使用。這個(gè)操作會(huì)將指定文件在 work dir 的數(shù)據(jù)恢復(fù)成指定 commit 的樣子,且會(huì)刪除該文件在 stage 中的數(shù)據(jù),都無(wú)法恢復(fù),所以應(yīng)該慎重使用。
ssh-keygen -t ecdsa -b 521 -C "825830916@qq.com"
gedit ~/.ssh/id_ecdsa.pub
復(fù)制id_ecdsa.pub的全部?jī)?nèi)容,這種SSH傳輸方式非??焖俦憬?。
在github setting之中找到SSH and GPG keys添加。
將id_ecdsa.pub中的內(nèi)容復(fù)制到新建的 SSHkey中。
git fetch和git pull都可以將遠(yuǎn)端倉(cāng)庫(kù)更新至本地那么他們之間有何區(qū)別?想要弄清楚這個(gè)問題有有幾個(gè)概念不得不提。
FETCH_HEAD: 是一個(gè)版本鏈接,記錄在本地的一個(gè)文件中,指向著目前已經(jīng)從遠(yuǎn)程倉(cāng)庫(kù)取下來(lái)的分支的末端版本。
commit-id:在每次本地工作完成后,都會(huì)做一個(gè)git commit 操作來(lái)保存當(dāng)前工作到本地的repo, 此時(shí)會(huì)產(chǎn)生一個(gè)commit-id,這是一個(gè)能唯一標(biāo)識(shí)一個(gè)版本的序列號(hào)。 在使用git push后,這個(gè)序列號(hào)還會(huì)同步到遠(yuǎn)程倉(cāng)庫(kù)。
有了以上的概念再來(lái)說說git fetch
git fetch:這將更新git remote 中所有的遠(yuǎn)程倉(cāng)庫(kù)所包含分支的最新commit-id, 將其記錄到.git/FETCH_HEAD文件中
git pull : 首先,基于本地的FETCH_HEAD記錄,比對(duì)本地的FETCH_HEAD記錄與遠(yuǎn)程倉(cāng)庫(kù)的版本號(hào),然后git fetch 獲得當(dāng)前指向的遠(yuǎn)程分支的后續(xù)版本的數(shù)據(jù),然后再利用git merge將其與本地的當(dāng)前分支合并。所以可以認(rèn)為git pull是git fetch和git merge兩個(gè)步驟的結(jié)合。
因此,git fetch是從遠(yuǎn)程獲取最新版本到本地,但不會(huì)自動(dòng)merge。
而git pull則是會(huì)獲取所有遠(yuǎn)程索引并合并到本地分支中來(lái)。效果相同時(shí)git pull將更為快捷。
這里拿我前些天在github倉(cāng)庫(kù)新建的項(xiàng)目為例。
echo "# DIY_CPU">>README.md
git init
git add README.md
git commit -m "first commit"
git config --global user.email "you@example.com"
git branch -M main
git remote add origin git@github.com:tongjiaxuan666/DIY_CPU.git
git push -u origin main
其中origin遠(yuǎn)程在本地的別名。
通過push命令將本地的history HEAD指向的版本提交上去。
git fetch --all
git pull
現(xiàn)在本地版本就是遠(yuǎn)程的最新版本了。
四. git在線練習(xí)平臺(tái)這是個(gè)叫做 Learning Git Branching 的項(xiàng)目,是我一定要推薦的:
這個(gè)網(wǎng)站的教程不是給你舉那種修改文件的細(xì)節(jié)例子,而是將每次 commit 都抽象成樹的節(jié)點(diǎn),用動(dòng)畫闖關(guān)的形式,讓你自由使用 Git 命令完成目標(biāo):
所有 Git 分支都被可視化了,你只要在左側(cè)的命令行輸入 Git 命令,分支會(huì)進(jìn)行相應(yīng)的變化,只要達(dá)成任務(wù)目標(biāo),你就過關(guān)啦!網(wǎng)站還會(huì)記錄你的命令數(shù),試試能不能以最少的命令數(shù)過關(guān)!
我一開始以為這個(gè)教程只包含本地 Git 倉(cāng)庫(kù)的版本管理,后來(lái)我驚奇地發(fā)現(xiàn)它還有遠(yuǎn)程倉(cāng)庫(kù)的操作教程!
網(wǎng)站地址:https://learngitbranching.js.org
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:四個(gè)指令玩轉(zhuǎn)github-創(chuàng)新互聯(lián)
URL地址:http://jinyejixie.com/article22/gppjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、建站公司、微信小程序、定制開發(fā)、移動(dòng)網(wǎng)站建設(shè)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容