作者:LogM
本文原載於 https://segmentfault.com/u/logm/articles ,不允許轉載~
1. 克隆
git clone <版本庫的網址>
git clone <版本庫的網址> <本地目錄名>
# 克隆版本庫的時候,所使用的遠程主機自動被git命名爲origin
# 使用-o修改遠程主機名
git clone -o <遠程主機名> <版本庫的網址>
2. 查看歷史
# 查看歷史的每一次操作
git reflog
# 查看歷史commit
git log
git log --oneline
# 查看commit的修改
git show <commit_id>
git show --stat <commit_id>
git show <commit_id> <filename>
# 查看兩個分支的差異
git diff <branch1> <branch2>
git diff --stat <branch1> <branch2>
# 查看某個文件的改動,還未add
git diff <filename>
# 查看已經add的文件相比上一次commit有哪些改動
git diff --cached
3. 遠程主機管理
# 列出所有的遠程主機名
git remote
# 參看遠程主機的網址
git remote -v
# 查看主機的詳細配置
git remote show <主機名>
# 添加遠程主機
git remote add <主機名> <網址>
# 刪除遠程主機
git remote rm <主機名>
# 遠程主機改名
git remote rename <原主機名> <新主機名>
4. 分支管理
# 將遠程主機新的更新取回本地,默認取回所有branch的更新
# 它取回的代碼對你本地的開發代碼沒有影響(只是讓 `git branch -a` 顯示出遠程新增的branch,不修改本地代碼)
git fetch <遠程主機名>
# 取回遠程主機的特定branch
git fetch <遠程主機名> <分支名>
# 查看遠程分支
git branch -r
# 查看所有分支
git branch -a
# 在origin/master的基礎上,新建本地分支
git checkout -b newBrach origin/master
# 相當於執行
git branch newBrach
git checkout newBrach
# 查看跟蹤關係
git branch -vv
# 手動建立追蹤關係
git branch --set-upstream-to=origin/remoteBranch localBranch
# 刪除本地分支
git branch -d <BranchName>
5. 拉回更新
# 取回遠程主機某個分支的更新,再與本地的指定分支合併
# 實質上,這等同於先做git fetch,再做git merge
git pull <遠程主機名> <遠程分支名>:<本地分支名>
# 採用rebase模式,可以使用--rebase選項
git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
# 如果遠程分支是與當前分支合併,則冒號後面的部分可以省略
git pull <遠程主機名> <遠程分支名>
# 如果本地的當前分支在遠程主機上已經有追蹤關係的分支,可以省略分支名
git pull <遠程主機名>
# 如果只有一個追蹤的分支,則可以省略主機名
git pull
# 如果遠程主機刪除了某個分支,默認情況下,git pull 不會在拉取遠程分支的時候,刪除對應的本地分支
# 加上參數 -p 就會在本地刪除遠程已經刪除的分支
git pull -p
# 等同於
git fetch --prune origin
git fetch -p
6. 推送更新
# 將本地分支的更新,推送到遠程主機
git push <遠程主機名> <本地分支名>:<遠程分支名>
# 如果省略遠程分支名,則表示將本地分支推送與之存在"追蹤關係"的遠程分支,如果該遠程分支不存在,則會被新建
git push origin master
# 如果省略本地分支名,則表示刪除指定的遠程分支,因爲這等同於推送一個空的本地分支到遠程分支
git push origin :master
# 等同於
git push origin --delete master
# 如果當前分支與遠程分支之間存在追蹤關係,則本地分支和遠程分支都可以省略
git push origin
# 如果當前分支只有一個追蹤分支,那麼主機名都可以省略
git push
# 還有一種情況,就是不管是否存在對應的遠程分支,將本地的所有分支都推送到遠程主機,這時需要使用--all選項
git push --all origin
# 如果遠程主機的版本比本地版本更新,推送時Git會報錯,應當先pull合併代碼。如果你一定要推送,可以使用--force選項
git push --force origin
# git push不會推送標籤(tag),除非使用--tags選項
git push origin --tags
7. 代碼回滾
# 文件被修改了,但未執行git add操作
git checkout fileName
# 同時對多個文件執行了git add操作,但本次只想提交其中一部分文件
# 取消暫存
git reset HEAD <filename>
# 文件執行了git add操作,但想撤銷對其的修改
# 取消暫存
git reset HEAD fileName
# 撤銷修改
git checkout fileName
# 修改的文件已被git commit,但想再次修改不再產生新的Commit
# 修改最後一次提交
$ git add fileName
$ git commit --amend -m"說明"
# 已在本地進行了多次git commit操作,現在想撤銷到其中某次Commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
# hard:重設index和working directory,從<commit>以來在working directory中的任何改變都被丟棄,並把HEAD指向<commit>
# soft:index和working directory中的內容不作任何改變,僅僅把HEAD指向<commit>。自從<commit>以來的所有改變都會顯示在git status的“Changes to be committed”中
# mixed:僅重設index,但是不重設working directory。這個模式是默認模式,即當不顯示告知git reset模式時,會使用mixed模式。這個模式的效果是,working directory中文件的修改都會被保留,不會丟棄,但是也不會被標記成“Changes to be committed”,但是會打出什麼還未被更新的報告
# 將本地的狀態回退到和遠程一樣
git reset --hard origin/devlop
# revert是放棄指定提交的修改,但是會生成一次新的提交,需要填寫提交註釋,以前的歷史記錄都在;
# reset是指將HEAD指針指到指定提交,歷史記錄中不會出現放棄的提交記錄。