git實(shí)戰(zhàn)技巧大綱
基本概念
git的三個分區(qū)
- 工作區(qū)(working directory)
- 暫存區(qū)(stage/index area)
- 提交歷史(commit history)
三個分區(qū)的關(guān)系
git 本地倉庫與遠(yuǎn)程倉庫
- 本地倉庫(repository)
- 遠(yuǎn)程倉庫(remote)
- 本地倉庫與遠(yuǎn)程倉庫機(jī)制是git 分布式特性的體現(xiàn)
- 一個本地倉庫可以對應(yīng)多個遠(yuǎn)程倉庫
- 本地倉庫和遠(yuǎn)程倉庫 可以通過 clone | push | pull | fetch 等方式交互

兩個倉庫的交互
git操作(指令)
日常操作
-
git add: 將文件加入暫存區(qū)
- add -u 將已加入暫存區(qū)的文件更新。
- add . 將文件的新建、更新,添加到暫存區(qū)。
- add -A 將文件的新建、更新、刪除,添加到暫存區(qū)。
git rm:將文件從暫存區(qū)和工作區(qū)中刪除
-
git diff:查看差異
- diff --cached 暫存區(qū)和HEAD的差異
- diff -- [文件名] 具體文件的差異
- diff 分支名 分支名 -- [文件名] 查看兩個分支直接的差異(輸入文件名則只看該文件)
git checkout -- [文件名]: 從暫存區(qū)復(fù)制對應(yīng)文件到工作區(qū),會覆蓋工作區(qū)內(nèi)容
-
git reset: 版本穿梭
- reset --soft [commit_id] 將暫存區(qū)與工作區(qū)都回撤到 [commit_id]的版本(差異恢復(fù)到暫存區(qū))
- reset --hard [commit_id] 將暫存區(qū)與工作區(qū)都回撤到 [commit_id]的版本(差異直接拋棄掉)
- 可以配合 git reflog 來回穿梭
-
git stash: 臨時存儲
- stash [save message]: 將當(dāng)前工作區(qū)和暫存區(qū)的內(nèi)容進(jìn)行存儲(未跟蹤文件不會進(jìn)行存儲)
- stash -u 將當(dāng)前工作區(qū)和暫存區(qū)的內(nèi)容進(jìn)行存儲(未跟蹤文件也會進(jìn)行存儲)
- stash list 查看存儲列表
- stash pop [stash_id] 彈出單個存儲(被彈出的存儲從list中消失)
- stash apply [stash_id] 應(yīng)用單個存儲(被應(yīng)用的存儲不會從list中消失)
- stash drop [stash_id] 刪除單個存儲
- stash clear 刪除所有存儲
-
分支相關(guān)操作
- git branch 查看本地分支
- git branch -r 查看遠(yuǎn)程分支
- git branch -a 查看所有分支
- git branch -d [branch_name] 刪除分支
- git branch [branch_name] 新建分支(不會自動切換到新建分支)
- git checkout -b 切換分支(自動切換到新建分支)
- git merge [branch_name] 將[branch_name]與當(dāng)前分支合并
rebase(變基)
rebase 總結(jié)來說就是用于整理分支
-
rebase 常用功能如下
- 修改commit message
- 合并commit
- 舍棄commit(慎用)
- 整理多分支開發(fā)時導(dǎo)致的commit tree分叉
-
rebase -i 中的操作
- pick:保留該commit(縮寫:p)
- reword:保留該commit,但我需要修改該commit的注釋(縮寫:r)
- edit:保留該commit, 但我要停下來修改該提交(不僅僅修改注釋)(縮寫:e)
- squash:將該commit和前一個commit合并(縮寫:s)
- fixup:將該commit和前一個commit合并,但我不要保留該提交的注釋信息(縮寫:f)
- exec:執(zhí)行shell命令(縮寫:x)
- drop:我要丟棄該commit(縮寫:d)
-
修改commit message 的流程
- git rebase -i [commit_id]
- 進(jìn)入vi界面后將需要修改commit message 的commit 的操作符改為reword
- 進(jìn)入到修改界面
-
合并commit 的流程
- git rebase -i [commit_id]
- 進(jìn)入vi界面后將需要合并的commit 的操作符改為squash 或者 fixup
-
舍棄commit 的流程
- git rebase -i [commit_id]
- 進(jìn)入vi界面后將需要舍棄 的操作符改為drop
- 如果舍棄的commit引起沖突,先修改沖突,然后git rebase --continue