這篇文章的目的是給經常使用git管理項目提供一個有益的提醒。如果你是git新手,可以先閱讀文後的引用部分,然後在回頭閱讀此篇文章。在介紹git指令之前,你可以先看看來自 on-my-zsh 提供的别名。
基本指令
-
git config --global user.name "Your Name"
-
git config --global user.email "[email protected]"
-
git config --global core.editor <your favorite editor here>
- Ex:
git config --global core.editor vim
- Ex:
-
:初始化一個repo。git init
Commit 結構
-
(git status
):檢視 repo 狀态gst
- 工作區:
- .git 目錄
- 暫存區
- 工作目錄
-
git add <filename>
):添加一個檔案到暫存區ga
-
git add .
):添加所有檔案到暫存區gaa
-
:添加所有字尾為js的檔案到暫存區git add *.js
-
:從暫存區删除一個新檔案git rm --cached <file>
-
git commit -m "My first commit"
):建立一次帶 message 的送出gcmsg
-
git commit -v -a
):gca
-
是 verbose 的縮寫,會在底部顯示差異資訊和更多有意義的資訊-v
-
類似于-a
,會添加所有被修改和删除的檔案,但會忽略新建立的檔案git add .
-
-
:檢視對應指令的幫助手冊git help <command>
-
git log
,glg
glgg
glo
):檢視項目的送出曆史glog
暫存區管理
-
git reset HEAD <filename>
):從暫存區删除一個被修改的檔案grh
-
git reset HEAD
):從暫存區删除所有被修改的檔案grh
-
git checkout <filename>
):從暫存區删除一個被修改的檔案,并撤銷檔案的更改gco
-
:添加檔案/更改在暫存區的最後一次送出git commit -m "My first commit" --amend
-
git commit -v -a --amend
):添加檔案/更改在暫存區的最後一次送出gca!
-
:告訴git,哪些檔案不被加入版本跟蹤.gitignore
- 可以使用
指令添加一個不被版本跟蹤的檔案git add <filename> -f
- 可以使用
-
git diff <filename>
):檢視基于目前檔案的最後一次送出的更改差異gd
-
git diff
):檢視基于所有檔案的最後一次送出的更改差異gd
-
:從項目送出曆史中删除最近兩次送出,但不丢棄檔案的更改git reset HEAD~2 --soft
-
:從項目送出曆史中删除最近兩次送出,但會丢棄檔案的更改和在(最後兩次)送出中建立的新檔案git reset HEAD~2 --hard
-
:git reset <commit> --soft --hard
-
:将所有被更改的檔案回溯到“待送出”狀态--soft
-
:--hard
之後,對被git追蹤的檔案的任何更改都被丢棄commit
-
-
:顯示包括 被撤銷 在内的所有送出git reflog
-
:重新送出(restore the commit)git merge <commit hash>
-
:删除工作目錄中不被git進行版本追蹤的檔案git clean -f
Stashed & Branches
Stash
-
git stash
):将所有暫存區的檔案移動到“儲藏區”,類似于另一種類型的工作區gsta
-
:檢視儲藏隊列(Stash lists)git stash list
-
:将最近一次儲藏恢複到暫存區(可以用類似git stash apply
(num從0開始計數) 的指令來使用在隊列中的任意一個儲藏(stashes))git stash apply stash@{num}
-
:清空儲藏隊列git stash clear
-
:為儲藏設定命名git stash save "name of the stash"
-
git stash pop
):将最近一次儲藏恢複到暫存區并從儲藏隊列删除此儲藏gstp
-
git stash drop
):從儲藏隊列删除最近一次儲藏(gstd
)(stash@{0}
從儲藏隊列删除指定儲藏)git stash drop stash@{num}
Branch
-
git checkout -b dev
):建立 dev 分支并從目前分支切換到 dev 分支gco
-
git branch
):檢視所有分支gb
-
git checkout master
):切換到主分支gcm
-
git merge <branch>
):合并分支gm
-
:先将 master 上的更改合并到目前分支,再添加目前分支的更改。如果有沖突,解決沖突後加git rebase master
參數繼續合并--continue
-
: 删除分支,git branch -d <branch>
則強制删除分支-D
-
:将多次送出合并成一個,其流程如下:git merge <branch> --squash
# Go to the `master` branch
git checkout master
# Create a temp branch
git checkout -b temp
# Merge the feature/x branch into the temp using --squash
git merge feature/x --squash
# See the new modifications/files in the Staging Area
git status
# Create the unified commit
git commit -m "Add feature/x"
# Delete the feature/x branch
git branch -D feature/x
- rebase 和 merge 的差別:
- rebase:
- 送出曆史(的展示)是線性的
- 缺點:會删除最近一個 commit,然後建立一次新的 commit
- 如果已送出到遠端,不要使用 rebase
- merge:
- 送出曆史(的展示)是分叉的
- 對于兩個分支的合并,會建立一個次新的 commit
- rebase:
遠端倉庫管理
-
:添加一個将被追蹤的遠端倉庫git remote add <name> <url>
-
:移除一個遠端倉庫git remote rm <name>
-
git push <remote> <remote-branch>
gp
):将目前分支的本地 commit 推送到遠端倉庫ggp
-
:拉取遠端倉庫的最新 commit 到目前(本地)分支(git fetch <remote> <remote-branch>
),不會合并<remote>/<branch>
-
git pull <remote> <remote-branch>
gl
):拉取遠端倉庫的最新 commit 到目前(本地)分支,并自動 mergeggl
-
git pull --rebase
):以 rebase 的方式進行合并,而不是 mergegup
-
其它有用的指令
-
:建立一個 tag(如:v1.3)git tag <name>
-
:将本地 tags 推送到遠端倉庫git push --tags
-
:推送指定的本地 tag 到遠端git push <tag>
熬夜不易,點選請老王喝杯烈酒!!!!!!!