Git 快速入門

Git是目前世界上最先進的分佈式版本控制系統!(一條五毛,括號刪掉)
先進的系統都是很人性化的,所以入門並不困難。

第一步當然是安裝,Git的安裝十分簡單,參考:安裝Git
廖大佬的這個Git教程也非常基礎,適合新手入門,我這裏將其精華提出,做一個快速入門。

創建版本庫

這裏是指創建本地版本庫,也就是本地倉庫。
在任意位置創建一個空的目錄,這裏注意目錄路徑不要包含中文
進入創建好的目錄下,打開Git Bash,執行init命令來初始化版本庫:

$ git init
Initialized empty Git repository in E:/develper/test-data/git-demo2/.git/

執行成功後會在目錄下多出來一個 .git 隱藏目錄,到這裏本地版本庫就創建成功了。

常用命令

add

當我們在版本庫中有文件的修改操作時,都可以使用add命令:

$ git add filename

例如:
新增demo.txt文件後,使用:$ git add demo.txt
修改demo.txt文件後,也可以使用:$ git add demo.txt

status

使用add命令後無任何提示就是成功了,可以使用status命令查看當前工作樹的狀態:

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   demo.txt

commit

從最後一行可以看出,系統發現一個新文件demo.txt,此時的demo.txt文件只是在添加到了暫存區,版本庫中還沒有該文件,我們還需要使用commit命令:

$ git commit -m "create demo.txt"
[master (root-commit) 8b8daa1] create demo.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 demo.txt

commit命令就是將暫存區的文件修改提交到版本庫中,-m 是message的首字母,是爲當前這次提交寫入註解,與SVN中類似。

diff

這裏我們修改一下demo.txt文件,加入 hello git,然後使用diff命令開始文件比較:

$ git diff demo.txt
diff --git a/demo.txt b/demo.txt
index e69de29..f09e9c3 100644
--- a/demo.txt
+++ b/demo.txt
@@ -0,0 +1 @@
+hello git
\ No newline at end of file

主要看倒數第二行,+表示新增的行,-表示刪除的行,從這裏就能看出我們對demo.txt文件新增了一行 hello git
文件修改也是使用add命令,然後使用commit命令提交。

log

當我們忘記之前提交的內容的時候,可以使用log命令來查看歷史提交記錄:

$ git log
commit a8e2d4224baf763cbf54197fbe972167ecae6b97 (HEAD -> master)
Author: tanwubo <[email protected]>
Date:   Thu Feb 28 10:38:43 2019 +0800

    modifier demo.txt

commit 8b8daa10dba766e2bf10d431c17f233825f69846
Author: tanwubo <[email protected]>
Date:   Thu Feb 28 10:21:02 2019 +0800

    create demo.txt

這裏就凸顯出再使用commit命令時的-m參數的重要性了,我們可以通過描述信息大致瞭解到每一次提交的內容。
這裏還有一個需要知道的,commit後面的那一串形似密文的字符串,這個就是版本號了,由於git是分佈式版本控制軟件,所以並不能像svn那樣使用遞增數字來標識版本號。

reset

我們通過log命令可以查看到每次提交的版本號,通過版本號使用reset命令可以回退到任何一個版本,像這樣:

$ git reset --hard 8b8daa10dba766e2bf10d431c17f233825f69846
HEAD is now at 8b8daa1 create demo.txt

這裏的--hard參數還不太清楚其含義,後面跟的就是版本號了,當然也可以不用寫全,只寫部分前綴,git會自己去匹配對應的版本號,不過這裏要保證前綴只能匹配到唯一一個版本號。
這裏的版本號也可以使用HEAD去代替,HEAD會指向最近一次提交的版本,HEAD^表示上一個版本,HEAD^^就是上上個版本,依次類推。
當然reset命令不僅能回退,它能將工作空間的內容變更爲任何一個提交的版本,只要有版本號。

reflog

想知道自己之前做了哪些操作時,可以使用reflog命令,像這樣:

$ git reflog
8b8daa1 (HEAD -> master) HEAD@{0}: reset: moving to 8b8daa10dba766e2bf10d431c17f233825f69846
a8e2d42 HEAD@{1}: commit: modifier demo.txt
8b8daa1 (HEAD -> master) HEAD@{2}: commit (initial): create demo.txt

撤銷修改

當自己寫入了錯誤的內容時,可以使用git checkout -- filename來撤銷你的修改:

$ cat demo.txt
hello git
My stupid boss still prefers SVN.

$ git checkout -- demo.txt

$ cat demo.txt
hello git

注意:checkout只能將文件撤銷至上一次add命令後,或者是上一次commit命令後的狀態。這裏如果我們在修改了文件後執行了add命令,那麼這些修改是無法通過checkout命令來撤銷的。

$ cat demo.txt
hello git
My stupid boss still prefers SVN.

$ git add demo.txt

$ git checkout -- demo.txt

$ cat demo.txt
hello git
My stupid boss still prefers SVN.

當然這種情況也是可以撤銷的,只不過需要多一個步驟,當文件內容修改後執行了add命令,這裏的修改就會被提交到暫存區,我們需要通過git reset HEAD filename命令將該文件在暫存區的修改撤銷掉,然後再通過git checkout -- filename命令撤銷掉工作區的修改,像這樣:

$ cat demo.txt
hello git
My stupid boss still prefers SVN.
##修改已經使用add命令提交到了暫存區
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   demo.txt
        
$ git reset HEAD demo.txt
Unstaged changes after reset:
M       demo.txt
##暫存區的修改被撤銷,重新回到了工作區
$ 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:   demo.txt

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

$ git checkout -- demo.txt

$ cat demo.txt
hello git

rm

當我們需要刪除一個文件時,可以手動刪除,然後使用add命令添加到暫存區,再commit到版本庫。也可以使用git rm filename命令刪除,使用rm命令相當於手動刪除文件再add到暫存區。然後都需要使用commit提交修改到版本庫。
手動刪除後使用add命令:

$ git add rm.txt

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    rm.txt

$ git commit -m "rm rm.txt"
[master 55e038d] rm rm.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 rm.txt

使用rm命令:

$ git rm rm.txt
rm 'rm.txt'

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    rm.txt

$ git commit -m "rm rm.txt"
[master 9975c16] rm rm.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 rm.txt

當然,刪除的撤銷與修改的撤銷是一樣的,可以參考撤銷修改。

以上這些都是版本控制系統的基本操作,並不屬於Git的特色,但也是需要掌握的基礎內容,下面來了解Git的特點。

遠程倉庫

設值SSH祕鑰

使用碼雲來做遠程倉庫,在用戶目錄下的.ssh(C:\Users\username.ssh)下運行:

$ ssh-keygen -t rsa -C "[email protected]"

運行時遇到的選項直接按回車,全部使用默認值,最後會在目錄下生成id_rsaid_rsa.pub倆個文件,我們將id_rsa.pub文件裏面的內容貼到碼雲的SSH公鑰中即可。
我們前面創建了一個git-demo2的本地版本庫,這裏我們在碼雲上也創建一個git-demo2的版本庫,然後將倆者進行關聯,就可以做遠程倉庫的推送、拉取了。

建立關聯

碼雲上創建新的倉庫十分簡單,這裏不做展示,創建好之後我們通過remote命令進行關聯:

$ git remote add origin [email protected]:tanwubo/git-demo2.git

這邊的地址替換成自己在碼雲上新建的版本庫地址。

推送數據

關聯建立好之後,我們將本地的內容推送到碼雲上:

$ git push -u origin master
The authenticity of host 'gitee.com (218.11.0.86)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,218.11.0.86' (ECDSA) to the list of knownhosts.
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (11/11), 923 bytes | 923.00 KiB/s, done.
Total 11 (delta 3), reused 0 (delta 0)
remote: Powered By Gitee.com
To gitee.com:tanwubo/git-demo2.git
 * [new branch]      master -> master

出現這樣的信息則表示成功了。在第一次推送時記得加上-u參數,後續的推送只需要使用:git push origin master就可以了。

clone

git上面的項目都會有一個類似於[email protected]:tanwubo/git-demo2.git這樣的地址,我們可以使用clone命令複製一份版本庫到本地:

$ git clone [email protected]:tanwubo/git-demo2.git
Cloning into 'git-demo2'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 14 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (14/14), done.
Resolving deltas: 100% (3/3), done.

分支管理

分支可以說是Git的又一大特色功能,在我們準備開發新功能時、在程序出現BUG需要修復時,我們都可以爲它建立分支,並且Git無論創建、切換和刪除分支,Git在1秒鐘之內就能完成,並且與版本庫的大小無關。

checkout

我們可以使用git checkout -b branchname的形式來創建並切換到指定分支,像這樣:

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

branch

這條指令是git branch branchnamegit checkout branchname倆條指令的簡化版,所以我們也可以這樣做:

$ git branch local

$ git checkout local
Switched to branch 'local'

從這裏還看不出我們切換了分支,我們可以使用git branch來查看當前選擇的分支情況:

$ git branch
  dev
* local
  master

merge

然後我們對local分支進行修改操作,並將其合併到master分支上:

$ cat demo.txt
hello git!
local branch modifier.

$ git add demo.txt

$ git commit -m "local branch modifier"
[local 9a132bd] local branch modifier
 1 file changed, 2 insertions(+), 1 deletion(-)

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

$ git merge local
Updating 80f6b47..9a132bd
Fast-forward
 demo.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

刪除分支

合併後可以選擇將被合併的分支刪除掉:

$ git branch -d local
Deleted branch local (was 9a132bd).

$ git branch
  dev
* master

這裏注意,如果需要刪除未合併的分支,則需要使用-D強行刪除:git branch -D local

合併衝突

當我們進行分支合併時,可能會出現修改同一個文件的情況,此時會出現合併衝突:

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

出現這種提示時就是有了合併衝突了。根據提示我們查看demo.txt文件

hello git!
<<<<<<< HEAD
local branch modifier
=======
dev branch modifier
>>>>>>> dev

通過<<<<<<< HEAD=======包起來的部分是當前分支的內容,======>>>>>>> dev包起來的部分是dev分支的內容,手動的選擇需要的部分進行替換,然後對衝突文件再次addcommit即可。

$ cat demo.txt
hello git!
local branch modifier
dev branch modifier

$ git add demo.txt

$ git commit -m "solve conflict"
[master 23a4b8b] solve conflict

stash

當我們的系統出現BUG需要修復,但是手頭上的任務還未開發完,提交上去也不太合適的時候,可以通過stash命令將工作現場進行保存,在解決完BUG後回到該分支還原保存的現場:

# 還有未提交的修改
$ git status
On branch dev
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:   demo.txt

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

$ git stash
Saved working directory and index state WIP on dev: 23a4b8b solve conflict

$ git stash list
stash@{0}: WIP on dev: 23a4b8b solve conflict

# 創建BUG分支
$ git checkout -b bug-001
Switched to a new branch 'bug-001'

# 解決BUG後切換回dev分支繼續開發
$ git checkout dev
Switched to branch 'dev'

# pop參數可彈出並刪除最近保存的工作狀態
$ git stash pop
On branch dev
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:   demo.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (dc7952ffd5c944f930bf21e4bc7cf2ed162c695d)

遠程分支

推送分支

前面的分支操作都是在本地版本庫上進行的,所以我們還需要把本地分支推送給遠端:

$ git push origin dev
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (15/15), 1.17 KiB | 601.00 KiB/s, done.
Total 15 (delta 2), reused 0 (delta 0)
remote: Powered By Gitee.com
To gitee.com:tanwubo/git-demo2.git
 * [new branch]      dev -> dev

拉取分支

在我們使用clone命令複製版本庫時,默認情況下只能查看到master分支:

$ git clone [email protected]:tanwubo/git-demo2.git
Cloning into 'git-demo2'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 29 (delta 5), reused 0 (delta 0)
Receiving objects: 100% (29/29), done.
Resolving deltas: 100% (5/5), done.

$ cd git-demo2/

$ git branch
* master

如果要獲取遠程倉庫的其他分支,還需要使用這樣一條命令:

$ git checkout -b dev origin/dev
Switched to a new branch 'dev'
Branch 'dev' set up to track remote branch 'dev' from 'origin'.

$ git branch
* dev
  master

注意:這裏我在clone別人的項目時,使用git checkout -b branchname origin/branchname命令時會失敗,這時需要使用git fetch抓取一下遠端版本庫的信息,然後再次執行命令即可。

遠程分支衝突

這部分由於條件有限,沒辦法演示出來了…
但是大體的流程爲:

  1. A修改master分支的demo.txt文件
  2. A嘗試將修改推送到遠端版本庫,推送成功
  3. B提交master分支的demo.txt文件
  4. B嘗試將修改推送到遠端版本庫,發生衝突
  5. B使用pull命令拉取代碼
  6. B在本地版本庫解決衝突,這裏與本地分支衝突類似
  7. B將解決好衝突的文件add、commit後再次推送,推送成功。

注意:這裏的第五步如果當前不是master分支,很有可能會pull失敗,因爲本地分支沒有與遠端的分支建立關聯,需要執行:git branch --set-upstream-to=origin/branchname branchname後再次pull即可。

標籤管理

標籤和分支類似,標籤會綁定在某一個commit上,並且可以爲其取一個有意義的標籤名。

創建標籤

使用tag命令來打標籤:

$ git tag v1.0

$ git tag
v1.0

還可以使用:git tag v1.0 9975c160f9320687a634d3504e035706a442e3a9這種形式指定爲某一個commit打標籤。

查看標籤詳情

使用show命令來查看標籤詳情:

$ git show v1.0
commit 80f6b47abeddf4bd3dc377f99c8837276e33d0df (HEAD -> master, tag: v1.0, origin/master, origin/HEAD)
Author: tanwubo <[email protected]>
Date:   Thu Feb 28 14:04:23 2019 +0800

    test

diff --git a/demo.txt b/demo.txt
index f09e9c3..27706f8 100644
--- a/demo.txt
+++ b/demo.txt
@@ -1 +1 @@
-hello git
\ No newline at end of file
+hello git!
\ No newline at end of file

刪除標籤

使用-d參數刪除標籤:

$ git tag
v1.0
v1.1

$ git tag -d v1.1
Deleted tag 'v1.1' (was 80f6b47)

$ git tag
v1.0

如果需要遠程刪除,命令較麻煩,像這樣:

$ git tag -d v1.1
Deleted tag 'v1.1' (was 80f6b47)

$ git push origin :refs/tags/v1.1
remote: Powered By Gitee.com
To gitee.com:tanwubo/git-demo2.git
 - [deleted]         v1.1

推送標籤

如果需要把標籤推送到遠程版本庫,可以像這樣:

# 推送單個tag
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered By Gitee.com
To gitee.com:tanwubo/git-demo2.git
 * [new tag]         v1.0 -> v1.0

# 推送全部tag
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered By Gitee.com
To gitee.com:tanwubo/git-demo2.git
 * [new tag]         v1.1 -> v1.1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章