
一、常見命令
git init
: 初始化 git 倉庫,即將一個文件夾初始化為一個 git 倉庫。具體的操作是創建一個.git
隱藏文件夾git status
: 查看倉庫的狀態git add <file>
: 將文件提交到暫存區git commit -m <代碼提交信息>
: 將暫存區的文件提交到倉庫中,並附帶說明信息git log
: 查看所有產生的 commit 記錄git config -l
: 查看自己的配置,默認配置都在.git/config
文件中
1.2 分支相關的命令
git branch <branch_name>
: 如果不加上<branch_name>
,查看當前分支情況。如果加上,就是創建一個分支。git checkout <branch_name>
: 切換到<branch_name>
的分支上git checkout -b <branch_name>
: 創建一個分支並切換到這個分支上,效果相當於合並上面 2 個命令。git merge <branch_name>
: 將<branch_name>
分支合並到當前所在的分支上git branch -d <branch_name>
: 將<branch_name>
分支刪除git branch -D <branch_name>
: 將<branch_name>
分支強制刪除。如果<branch_name>
分支存在未合並的代碼時,那么用-d
是刪除不了。
1.3 標簽相關的命令
git tag
: 查看歷史 tag 記錄。git tag <tag_name> <commit_id>
: 在指定提交 id 上創建一個 tag。如果不寫<commit_id>
,那就在最新的 commit 上創建一個 tag。git checkout <tag_name>
: 切換到<tag_name>
標簽git show <tag_name>
: 查看標簽信息git tad -d <tag_name>
: 刪除標簽git push origin <tag_name>
: 將某個標簽推送到遠程倉庫git push origin :refs/tags/<tag_name>
: 可以刪除一個遠程標簽。
1.4 SSH
提前申明, windows 系統並不自帶 SSH, 但是安裝的 Git 中帶有 SSH。所以以下命令請在 Git bash 下執行。
ssh-keygen -t rsa
: 指定 rsa 算法生成密鑰。ssh -T git@github.com
: 測試 ssh 是否成功添加到 github 中
1.5 Github 操作
git clone ...
: 將 github 項目復制到本地的當前目錄git push origin <本地分支>:<遠程分支>
: 把本地分支中本地代碼同步到遠程分支git pull orgin <branch_name>
: 把遠程 <branch_name> 分支的最新的代碼同步到本地當前分支中get remote add origin git@github.com:xxx/xxxx.git
: 將當前本地倉庫與遠程進行聯接git remote -v
: 查看我們當前項目有哪些遠程倉庫
1.6 補充命令
-
alias 別名
git config --global alias.<別名> "<原命令>"
。比如git config --global alias.c "checkout"
,之后git c
==git checkout
-
diff
git diff
: 比較工作區文件和暫存區文件差異。如果加上文件名,就僅比較這個文件在工作區與暫存區的區別git diff <commit_id1> <commit_id2>
: 比較兩次提交之間的差異
-
checkout
- 作用 1 :切換分支、標簽以及 commit。本質是「用某個 HEAD 中的最新內容替換掉你的工作區中的文件」。切換時,暫存區的內容不受影響但相當於在切換前執行了
git stash
- 作用 2 :撤銷還沒進入暫存區的修改的作用。舉個例子,假設我們在一個分支開發一個小功能,剛寫完一半,這時候需求變了,而且是大變化,之前寫的代碼完全用不了了,好在你剛寫,甚至都沒有 git add 進暫存區,這個時候很簡單的一個操作就直接把原文件還原:
git checkout a.md
,本質上是將 HEAD 內容覆蓋掉工作區的內容。注意,checkout 命令只能撤銷還沒有 add 進暫存區的文件。
- 作用 1 :切換分支、標簽以及 commit。本質是「用某個 HEAD 中的最新內容替換掉你的工作區中的文件」。切換時,暫存區的內容不受影響但相當於在切換前執行了
-
stash
- 作用:把當前分支中的工作區的所有修改先暫存到棧上。
- 運用場景:假設我們正在一個新的分支做新的功能,這個時候突然有一個緊急的bug需要修復,而且修復完之后需要立即發布。當然你說我先把剛寫的一點代碼進行提交不就行了么?這樣理論上當然是ok的,但是這會產品垃圾commit,原則上我們每次的commit都要有實際的意義,你的代碼只是剛寫了一半,還沒有什么實際的意義是不建議就這樣commit的,那么就用
git stash
保留。 git stash
: 把當前分支所有沒有 commit 的代碼先暫存起來git stash list
: 查看所有 stash 記錄git stash apply
: 將暫存的代碼還原git stash drop
: 把最近一條 stash 記錄刪除。注意:每次還原代碼后,最好刪除這條 stash 記錄git stash pop
==git stash apply
+git stash drop
- 注意:執行了
git add
的數據在切換分支時,會自動暫存一起。本質上是因為切換分支不影響暫存區的數據。但需要手動恢復。
二、常用概念
2.1 工作區、暫存區與 HEAD
- 工作區就是你還沒有執行
git add
的文件,它持有實際文件; - 暫存區就是你執行了
git add
但沒執行git commit
的文件,它像個緩存區域,臨時保存你的改動; - HEAD 就是你執行完
git commit
,它指向你最后一次提交的結果並且清空暫存區。

在實際中,工作區有一個隱藏目錄 .git
,它不屬於工作區,而是 Git 的版本庫。Git 的版本庫里存了很多東西,其中最重要的就是稱為 stage(或者叫 index )的暫存區,還有 Git 為我們自動創建的第一個分支
master ,以及指向master的一個指針叫 HEAD。

與此同時,History 保存着所有分支信息,HEAD 指針指向當前分支。


上述命令有待驗證。
2.2 分支 branch
stormzhang 從0開始學習 GitHub 系列之「團隊合作利器 Branch」
2.3 標簽 tag
本質:標簽作用於提交上,可以看成是某個提交的別稱。
運用:主要用於標記軟件的版本號。
2.4 SSH
簡單點說,SSH是一種網絡協議,用於計算機之間的加密登錄。目前是每一台 Linux 電腦的標准配置。而大多數 Git 服務器都會選擇使用 SSH 公鑰來進行授權,所以想要在 GitHub 提交代碼的第一步就是要先添加 SSH key 配置。
命令生成的密鑰會存放在兩個文件 id_rsa 和 id_rsa.pub ,而 id_rsa 是私鑰,id_rsa.pub 就是公鑰。這兩文件默認分別在如下目錄里生成:
Linux/Mac 系統 在 ~/.ssh
下,win系統在 /c/Documents and Settings/<username>/.ssh
下,都是隱藏文件,相信你有辦法查看的。
接下來要做的是把 id_rsa.pub 的內容添加到 GitHub 上,這樣你本地的 id_rsa 私鑰跟 GitHub 上的 id_rsa.pub 公鑰進行配對,授權成功才可以提交代碼。
2.5 Github 操作
Push
如果你本地代碼有更新,那么就需要把本地代碼推到遠程倉庫,這樣本地倉庫跟遠程倉庫就可以保持同步了。
Pull
如果遠程倉庫有更新,那么需要把遠程倉庫的最新代碼更新到本地,然后保證兩端代碼的同步。一般我們在 push 之前都會先 pull ,這樣不容易沖突。
先有遠程倉庫,后有本地倉庫:Clone
使用 git clone
命令,將遠程倉庫復制到本地中。然后,修改本地倉庫並進行 git commit
。然后,git pull orgin <遠程分支>
建立本地倉庫和遠程倉庫之間聯系以及保持同步。最后,git push origin <本地分支>:<遠程分支>
將本地倉庫的修改提交到遠程倉庫中
通過 git clone
命令復制的倉庫,不需要使用 git init
初始化,同時也不需要聲明與遠程倉庫關聯(因為已經聲明了)。
先有本地倉庫,后有遠程倉庫:關聯本地已有項目
如果我們本地已經有一個完整的 git 倉庫,並且已經進行了很多次 commit ,我們想將本地倉庫提交到 github 上。
假設本地倉庫 test2,要提交到 github test 項目中,一般步驟是:
- 在 github 創建 test 項目
- 在 test2 目錄中輸入
git remote add origin git@github.com:xxxx/test.git
將本地 test2 項目與 github 的 test 項目關聯起來 git push origin master
合並操作:merge & rebase
git merge branch_a
與 git rebase branch_a
的效果是一樣,都是將 branch_a
分支合並到當前的分支中。但兩者合並方式不同:rebase 跟 merge 的區別你們可以理解成有兩個書架,你需要把兩個書架的書整理到一起去,
- 第一種做法是 merge ,比較粗魯暴力,就直接騰出一塊地方把另一個書架的書全部放進去,雖然暴力,但是這種做法你可以知道哪些書是來自另一個書架的;
- 第二種做法就是 rebase ,他會把兩個書架的書先進行比較,按照購書的時間來給他重新排序,然后重新放置好,這樣做的好處就是合並之后的書架看起來很有邏輯,但是你很難清晰的知道哪些書來自哪個書架。
合並沖突
如果兩個分支 a,b 同時修改了同一個位置時,合並到 master 時就會報沖突。不管兩個分支合並的先后順序、中間是否還合並了其他的分支(即任何情況下),都會報沖突。發生沖突的地方,Git 會在發生沖突的位置使用 <<<<< 、======、>>>>> 標記出不同分支的內容。如
<<<<<<< HEAD # HEAD 內容 Creating a new branch is quick & simple. ======= Creating a new branch is quick AND simple. >>>>>>> feature1 # feature1 分支的內容
此時,你需要手動地進行正確的合並后,再 git add .
與 git commit
就可以了。
2.6 Git 與 SVN 對比

Git 屬於分布式版本控制系統,而 SVN 屬於集中式。集中式版本控制只有中心服務器擁有一份代碼,而分布式版本控制每個人的電腦上就有一份完整的代碼。
參考:
工
鏈接:https://www.jianshu.com/p/3a437dbc6f2a
來源:簡書