git - 終端命令使用簡明指南

git - 終端命令使用簡明指南


cd進(jìn)入目標(biāo)文件夾,執(zhí)行git init創(chuàng)建新倉庫

git init

把一個文件放到倉庫只需要兩步
第一步,用命令git add告訴Git,把文件添加到倉庫:

git add readme.txt

第二步,用命令git commit告訴Git,把文件提交到倉庫:

git commit -m "wrote a readme file"

簡單解釋一下git commit命令,-m后面輸入的是本次提交的說明

掌握倉庫當(dāng)前的狀態(tài)
git status命令可以讓我們時刻掌握倉庫當(dāng)前的狀態(tài)

查看具體修改的內(nèi)容
git diff命令查看修改的具體內(nèi)容

git diff readme.txt

版本問題

  1. HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。
  2. 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。
  3. 要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)
創(chuàng)建Git版本庫時,Git自動為我們創(chuàng)建了唯一一個master分支,所以git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。
如果不add到暫存區(qū),那就不會加入到commit中.

撤銷修改
Git會告訴你,git checkout -- file可以丟棄工作區(qū)的修改:

git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區(qū)的修改全部撤銷,這里有兩種情況:

  • -一種是readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);
  • 一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

總之,就是讓這個文件回到最近一次git commitgit add時的狀態(tài)。
git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到git checkout命令。


命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū):
git reset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時,表示最新的版本。

場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- file。
場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,進(jìn)行版本回退,不過前提是沒有推送到遠(yuǎn)程庫。

刪除文件
一般情況下,你通常直接在文件管理器中把沒用的文件刪了,或者用rm命令刪了:

rm test.txt

有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,并且git commit

git rm test.txt
rm 'test.txt'
git commit -m "remove test.txt"

另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:

git checkout -- test.txt

git checkout其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”。
命令git rm用于刪除一個文件。如果一個文件已經(jīng)被提交到版本庫,那么你永遠(yuǎn)不用擔(dān)心誤刪,但是要小心,你只能恢復(fù)文件到最新版本,你會丟失最近一次提交后你修改的內(nèi)容

本地倉庫關(guān)聯(lián)遠(yuǎn)程倉庫
要關(guān)聯(lián)一個遠(yuǎn)程庫,使用命令

git remote add origin git@server-name:path/repo-name.git

關(guān)聯(lián)后,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

從遠(yuǎn)程倉庫克隆

git clone git@github.com:michaelliao/gitskills.git

要克隆一個倉庫,首先必須知道倉庫的地址,然后使用git clone命令克隆。
Git支持多種協(xié)議,包括https,但通過ssh支持的原生git協(xié)議速度最快。

分支管理###

分支在實際中有什么用呢?假設(shè)你準(zhǔn)備開發(fā)一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導(dǎo)致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進(jìn)度的巨大風(fēng)險。

現(xiàn)在有了分支,就不用怕了。你創(chuàng)建了一個屬于你自己的分支,別人看不到,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。

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

一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點:

0.png

每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長

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

1.png

Git創(chuàng)建一個分支很快,因為除了增加一個dev指針,改改HEAD的指向,工作區(qū)的文件都沒有任何變化!

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

2.png

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

3.png

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

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

4.png

首先,我們創(chuàng)建dev分支,然后切換到dev分支:

git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當(dāng)于以下兩條命令:

git branch dev
git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看當(dāng)前分支:

git branch
* dev
  master

git branch命令會列出所有分支,當(dāng)前分支前面會標(biāo)一個*號。

然后,我們就可以在dev分支上正常提交,比如對readme.txt做個修改,加上一行:
Creating a new branch is quick.
然后提交:

git add readme.txt 
git commit -m "branch test"

現(xiàn)在,dev分支的工作完成,我們就可以切換回master分支:

git checkout master
Switched to branch 'master'

切換回master分支后,再查看一個readme.txt文件,剛才添加的內(nèi)容不見了!因為那個提交是在dev分支上,而master分支此刻的提交點并沒有變:

5.png

現(xiàn)在,我們把dev分支的工作成果合并到master分支上:

git merge dev
Updating d17efd8..fec145a
Fast-forward
 readme.txt |    1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到當(dāng)前分支。合并后,再查看readme.txt的內(nèi)容,就可以看到,和dev分支的最新提交是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交,所以合并速度非??臁?br> 當(dāng)然,也不是每次合并都能Fast-forward,我們后面會講其他方式的合并。

合并完成后,就可以放心地刪除dev分支了:

git branch -d dev
Deleted branch dev (was fec145a).

刪除后,查看branch,就只剩下master分支了:

git branch
* master

因為創(chuàng)建、合并和刪除分支非???,所以Git鼓勵你使用分支完成某個任務(wù),合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

Git鼓勵大量使用分支:
查看分支: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>

解決沖突

準(zhǔn)備新的feature1分支,繼續(xù)我們的新分支開發(fā):

git checkout -b feature1
Switched to a new branch 'feature1'

修改readme.txt最后一行,改為:
Creating a new branch is quick AND simple.
feature1分支上提交:

git add readme.txt 
git commit -m "AND simple"
[feature1 75a857c] AND simple
 1 file changed, 1 insertion(+), 1 deletion(-)

切換到master分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.

Git還會自動提示我們當(dāng)前master分支比遠(yuǎn)程的master分支要超前1個提交。
master分支上把readme.txt文件的最后一行改為:
Creating a new branch is quick & simple.
提交:

git add readme.txt 
git commit -m "& simple"
[master 400b400] & simple
 1 file changed, 1 insertion(+), 1 deletion(-)

現(xiàn)在,master分支和feature1分支各自都分別有新的提交
這種情況下,Git無法執(zhí)行“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會有沖突,我們試試看:

git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

果然沖突了!Git告訴我們,readme.txt文件存在沖突,必須手動解決沖突后再提交。git status也可以告訴我們沖突的文件:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

我們可以直接查看readme.txt的內(nèi)容:

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.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容,我們修改如下后保存:
Creating a new branch is quick and simple.
再提交:

git add readme.txt 
git commit -m "conflict fixed"
[master 59bc1cb] conflict fixed

用帶參數(shù)的git log也可以看到分支的合并情況:

$ git log --graph --pretty=oneline --abbrev-commit
*   59bc1cb conflict fixed
|\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...

最后,刪除feature1分支:

git branch -d feature1
Deleted branch feature1 (was 75a857c).

完成

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

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

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