https://zhuanlan.zhihu.com/p/52654681
學習網站及本文插圖來源
創建版本庫
mkdir text
cd text
git init
把文件添加到倉庫
- git add: 把要提交的所有修改放到暫存區(Stage),可以add多次,添加多個文件
- git commit:一次性把暫存區的所有修改提交到分支,把所有add的文件一次性提交到分支,相當於遊戲的一次次的存檔,如此可回到某次commit狀態
- git log:查看提交(commit)歷史
- git log --pretty=oneline:簡化版歷史commit信息
- git push:以上兩個操作都是針對本地倉庫的,push可將修改提交到遠程倉庫
git add text.txt
git commit -m "提交信息"
回到上一版本
- HEAD:當前版本
- HEAD^:上一個版本
- HEAD^^:上上個版本
- HEAD~100:上一百個版本
- 回退版本命令:git reset
- 查看命令歷史:git reflog
git reset --hard HEAD^
# git reset --hard commit_id
工作區和暫存區
- git add:添加到暫存區stage
- git commit:把暫存區的內容提交到分支(提交後暫存區爲空,工作區對比倉庫無修改,提示“nothing to commit, working tree clean”)
管理修改
- 查看工作區和版本庫的區別:git diff HEAD -- readme.txt
撤銷修改
- 丟棄工作區的修改: git checkout -- file
- 撤銷暫存區的修改:git reset HEAD file
刪除文件
- 從版本庫中刪除文件:git rm fileName & git commit
- 恢復刪除的文件:git checkout -- fileName
創建與合併分支
- 每次提交git都把他們挨個按時間先後串成一條線,這條時間線就是一個分支
- 一開始只有master分支,它是一條線,git裏master指向最新的提交,HEAD再指向master
- HEAD指向當前分支,當前分支的名字是個指針,指向跟master相同的提交
- 創建一個分支的原理:新增一個指針,用HEAD指向該指針
- commit:在某分支上commit相當於增長時間線,分支的指針移動到該提交,master指針停留原地。
- checkout:HEAD指向該分支指針
- merge:與目標分支指針指向同一個commit
- -d:刪除分支指針(刪除分支)
- 查看分支:git branch
- 創建分支:git branch <name>
- 切換分支:git checkout <name>
- 創建+切換分支:git checkout -b <name>
- 合併某分支到當前分支:git merge <name>
- 刪除分支:git branch -d <name>
解決衝突
- 場景:a分支欲提pr合併到master分支上但是二者有部分文件有衝突
git checkout master
git pull
git checkout a
git merge master
衝突並可以在代碼中看到衝突提示!
修改保存
git add xxx.js
git commit -m "conflict fixed"
git push
- 查看分支合併情況:git log --graph --pretty=oneline --abbrev-commit
- 查看衝突文件:git status
- 臨時切換分支保存現場:git stash
- 恢復現場:git stash pop(需切回原分支)
- 在本分支最後一次commit基礎上合併另一分支的commit:git rebase xxx
git checkout a
git rebase master
衝突!
修改衝突並保存
git add xxx.js
git rebase --continue
標籤
- 創建標籤: git tag v1.0
- 給某次commit添加標籤:git tag v1.0 commitID
- 查看標籤: git tag
- 查看標籤信息:git show v1.0
- 刪除標籤:git tag -d v1.0
- 推送標籤到遠程:git push origin v1.0
- 一次推送所有未推送標籤到遠程:git push origin --tags
- 刪除遠程標籤:git tag -d v1.0 & git push origin :refs/tags/v1.0