常用客戶端:Gitkraken, Fork, Github 客戶端
(一) Git 命令
1. 初始化 Git
進入到自己想創建版本庫的目錄
-
輸入指令:
git init
的目錄,這個目錄就是Git用來跟蹤管理版本庫的。
3. 文件添加進遠程代碼庫
-
git add <文件名>
將文件名為filename
的文件添加進倉庫,可以多個文件名并列,用空格隔開 - 初次提交可以直接使用
git add .
將當前所有文件添加進倉庫 -
git commit -m "describe it"
將文件提交到本地分支倉庫的操作,后面加的是日志。 -
git add remote origin <遠程倉庫地址>
添加遠程倉庫地址 -
git pull --rebase origin master
如果在遠程倉庫中創建了諸如 README.md 等文件,需要先進行這不操作,保證本地也同步到遠程的文件 -
git push -u origin master
將本地代碼推送到遠程代碼庫
4. 提交和更新代碼操作
-
git add <文件名>
先把要更新的文件加入暫存區,,相應還有git add .
(提交新文件和被修改文件,不包括被刪除文件)、git add --all
(提交所有變化) 和git add -u
(提交被修改和被刪除文件,不包括新文件) -
git commit -m "describe it"
提交到本地分支倉庫 -
git push -u <分支名>
推送到遠程代碼倉庫 -
git pull <遠程主機名> <遠程分支名>:<本地分支名>
更新代碼,如果有沖突需要在本地提交
5. 日常模式總結
- 首先,用
git push origin branch-name
推送自己的修改; - 如果推送失敗,則因為遠程分支比你的本地更新,需要先用
git pull
試圖合并; - 如果合并有沖突,則解決沖突,并在本地提交;
- 沒有沖突或者解決掉沖突后,再用
git push origin branch-name
再次推送 - 如果
git pull
提示 “no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream branch-name origin/branch-name
。
6. 常用指令
-
git status
可以隨時倉庫當前狀態,查看已經命令過但還未經提交到倉庫的所有操作,可以看成是待處理事項列表 -
git diff
可以看到具體修改了哪些內容 -
git log
查看對倉庫的操作記錄 -
git rm <filename>
刪除文件,如果確認刪除,刪除后需要進行git commit -m "describe it"
操作,保證本地分支同步;如果需要回復刪除文件需要用git checkout --<filename>
操作,從分支倉庫中回復文件到暫存區 -
git clone git@server-name:path/repo-name.git
從遠程代碼倉庫克隆代碼 -
git branch
查看本地分支 -
git branch -r
查看遠程分支 -
git branch <本地分支名>
創建本地分支 -
git checkout <本地分支名>
切換到相應本地分支 -
git branch -d <本地分支名>
刪除分支 -
git merge <本地分支名>
與當前分支進行合并 -
git reset HEAD
取消緩存在暫存區的文件 -
git tag
查看版本 -
git tag <版本號>
創建新版本 -
git tag -d <版本號>
刪除版本
(二) Git 基本概念
1. 版本回退: git reset
- 每一次
commit
都是對應一個版本 -
commit id
是對版本的具體標識 -
HEAD
表示當前版本 -
HEAD^
表示上一個版本 -
HEAD^^
表示上上版本 -
HEAD~100
表示前100個版本 -
git reset --hard commitId
回退到版本號為commitId
的地方,也可以用HEAD
的形式表示。 - 穿梭前,用
git log
查看提交歷史,以便確定要回退到哪個版本。 - 重返未來,用
git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
2. 工作區和暫存區
-
先上一張很經典的圖
?
?
img?
工作區:就是我們在電腦中實際看到的;
版本庫:工作區中的隱藏目錄
.git
,就是版本庫;暫存區:暫存區的概念很重要,理解暫存區之后對于Git的版本管理會有一個比較清晰的思路。
master: 這是Git為我們自動創建的第一個分支。
我覺得如果把工作區看成是鍵盤終端輸入,版本庫中的
master
可以看成是電腦硬盤,我們輸入的內容首先是到緩存中的,并不是直接存入硬盤。當緩存區滿或者人為發送指令時才會將緩存區的內容寫入硬盤。-
以添加和文件修改為例,
git add
指令只是選中文件或者其他要提交的修改,將它們添加進暫存區。只有使用git commit
指令的時候,才將暫存區的所有內容提交到當前分支。?
(三) 分支管理
1. 分支需求描述
- 不完整的改動可以先放到分支上,這樣別人看不到分支的內容,不會相互影響。可以直到開發完畢后,再一次性合并到原來的分支上.
- 一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能確定當前分支,以及當前分支的提交點:
只有一條master時間線
2. 創建、合并和刪除分支
2.1 原理
-
創建新的分支:
當我們創建新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
?
?
img創建新的分支dev
-
Git創建一個分支很快,增加一個dev指針,改改HEAD的指向. 從現在開始,對工作區的修改和提交就是針對dev分支了,比如新提交一次后,dev指針往前移動一步,而master指針不變:
?
?
img對工作區的修改和提交
-
合并分支:
把dev合并到master上, 最簡單的方法就是直接把master指向dev的當前提交,就完成了合并:
?
?
img合并分支
-
刪除分支:
刪除dev分支就是把dev指針給刪掉,刪掉后就剩下了一條master分支:
?
?
img刪除分支
2.2 實戰
- take
dev
as an example - 創建分支:
git branch dev
- 切換到分支:
git checkout dev
- 創建+切換分支:
git checkout -b dev
- 查看當前分支:
git branch
- 切換到master分支:
git checkout master
- 合并指定分支到當前分支:
git merge dev
- 刪除分支:
git branch -d dev
-
git log --graph
命令可以看到分支合并圖。
3. 分支策略
在實際開發中,我們應該按照幾個基本原則進行分支管理:
master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面干活;
干活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;
-
你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。
4.所以,團隊合作的分支看起來就像這樣:?
?
img團隊合作分支
4. Bug分支
- 修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后刪除;
- 當工作沒有完成時,先把工作現場
git stash
一下,然后去修復bug. - 修復后,再
git stash pop
,回到工作現場。 - 要丟棄一個沒有被合并過的分支,可以通過
git branch -D <name>
強行刪除。
5. 多人協作
5.1 基本命令
當從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默認名稱是origin。
要查看遠程庫的信息,用
git remote
顯示更詳細的信息, 用
git remote -v
-
推送分支: 就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:
git push origin master git push origin dev
并不是一定要把本地分支往遠程推送,master分支是主分支,因此要時刻與遠程同步, 其他視情況而定.
git pull
抓取遠程的新提交.在本地創建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致;建立本地分支和遠程分支的關聯,使用
git branch --set-upstream branch-name origin/branch-name
;