特有名詞解釋
DETACHED HEAD
HEAD normally refers to a named branch (e.g. master). Meanwhile, each branch refers to a specific commit.
HEAD 通常指的是一個(gè)已被命名的分支(如master).但同時(shí)每一個(gè)分支可以指向一個(gè)具體的提交秤茅。DETACHED HEAD 意味著HEAD游標(biāo)指向一個(gè)具體的commit而非某個(gè)被命名的分支肢藐。(it means simply that HEAD refers to a specific commit, as opposed to referring to a named branch. )
在這種狀態(tài)下槽驶,一般會(huì)出現(xiàn)這個(gè)問題:Your branch and 'origin/master' have diverged 需要如下新建分支合并分支的方法解決:
git branch my-temporary-work
git checkout master
git merge my-temporary-work
為什么要設(shè)立一個(gè)暫存區(qū)的概念
便于小步提交。比如你本地改到一半箫津,有個(gè)緊急的 bug 需要修復(fù)。你不想將改到一半的東西 commit 進(jìn)去拨拓。所以先 stash 一下,改掉 bug 并 commit氓栈,然后 stash pop 出來繼續(xù)沒完成的工作渣磷。
小步提交對(duì)于維護(hù)大型項(xiàng)目很有意義,方便跟蹤每一步發(fā)生了什么追蹤問題授瘦。
代碼比對(duì)
git diff
僅僅是比較 unstaged 的代碼和 staged 的代碼的區(qū)別醋界。untracked 的代碼必須先 track.
提交文件
git commit
-a 參數(shù)只對(duì)修改或刪除的文件會(huì)自動(dòng)加到暫存區(qū),對(duì)新增文件(untracked)文件無效
-v (--verbose)推薦使用 -v 代替 -m 因?yàn)檫@樣可以更好地書寫多行 commit message
--amend 修改上一次的 commit message提完。注意如果是上一次修改已經(jīng)提交形纺,可能會(huì)出現(xiàn) Your branch and 'origin/master' have diverged 的問題。
刪除未監(jiān)視文件 (untracked files)
建議加上 -n 參數(shù)(表示 dry-run)不直接刪這些文件而是來先看看會(huì)刪掉哪些徒欣,防止重要文件被誤刪逐样。
git clean -nf
刪除 untracked files
git clean -nfd
連 untracked 的目錄也一起刪掉
用于保存和恢復(fù)工作進(jìn)度
git stash
意義: Stash(隱藏) the changes in a dirty working directory away
stash是臨時(shí)保存文件修改內(nèi)容的區(qū)域。stash可以暫時(shí)保存工作樹和索引里還沒提交的修改內(nèi)容打肝,您可以事后再取出暫存的修改脂新。
注意:stash 的信息為各個(gè)分支公用,以棧數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)信息闯睹。
git stash save "message..." 保存工作進(jìn)度 (簡寫版:git stash)
git stash list 顯示進(jìn)度列表
git stash pop (stash@{0}) 參數(shù)表示第幾個(gè)存儲(chǔ)的狀態(tài)
git stash drop 刪除最后一個(gè)存儲(chǔ)狀態(tài)戏羽,在遇到 stash merge 沖突時(shí)經(jīng)常使用(一般先解決合并沖突担神,然后 git stash drop )
git stash clear 清空
操作流程:保存工作進(jìn)度→完善緊急的修改→stash pop繼續(xù)之前沒完成的工作
[stash 儲(chǔ)藏](https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%EF%BC%88Stashing%EF%BC%89)
回退回滾
git reset——針對(duì)本地倉庫的文件的撤銷
git reset 是變更某分支 HEAD 游標(biāo)位置的命令楼吃。
git reset <文件所在路徑>
將 staged 狀態(tài)的文件變?yōu)?unstaged 狀態(tài)。
git reset --hard HEAD~2
將 HEAD 游標(biāo)回退兩個(gè)版本妄讯。
git reset --hard <commitID>
:將當(dāng)前分支重置為指定版本孩锡。(提交版本號(hào)commitID通過git log
查看)。應(yīng)用場(chǎng)景:當(dāng)你解決完沖突亥贸,并且在合并完成后發(fā)現(xiàn)一個(gè)錯(cuò)誤躬窜,你仍然還是有機(jī)會(huì)來簡單地撤銷它。你只須要鍵入 “git reset --hard ” 命令
git revert——針對(duì)遠(yuǎn)程倉庫 commit 的撤銷
git revert 用于撤銷已存在的 commit ,并且會(huì)創(chuàng)建一個(gè)新的提交朴摊,是一種安全的做法默垄。
reset VS revert
reset 是在正常的 commit 歷史中,刪除了指定的 commit 甚纲,這時(shí) HEAD 是向后移動(dòng)了口锭。而 git revert 不會(huì)改變現(xiàn)在的提交歷史,它是在正常的 commit 歷史中再 commit 一次介杆,他的 HEAD 是一直向前的鹃操。
因此韭寸,git revert 可以用在公共分支上,git reset 應(yīng)該用在私有分支上荆隘。你也可以把 git revert 當(dāng)作撤銷已經(jīng)提交的更改恩伺,而 git reset HEAD 用來撤銷沒有提交的更改。
分支管理
git branch
-
git branch
查看當(dāng)前 checkout 過哪些遠(yuǎn)程分支椰拒,并且會(huì)標(biāo)明當(dāng)前所在分支莫其。 -
git branch -v
除以上功能外還會(huì)顯示分支的最后提交記錄。 -
git branch --remote
查看遠(yuǎn)程庫有那些分支 -
git branch <分支名>
創(chuàng)建某分支耸三。和git checkout -b
區(qū)別在于不切換到該分支乱陡。 -
git branch -d <分支名>
刪除某分支(必須保證目前不處于該分支)(注意這一步僅僅是刪除本地分支,遠(yuǎn)程分支刪除還得用 git push) -
git branch -m <old-branch> <new-branch>
重命名分支(變更分支名)
git checkout
-
git checkout -f 目標(biāo)文件(夾)所在目錄
強(qiáng)行覆蓋本地的文件(夾)
①若修改后仍未放到緩存區(qū)仪壮,則恢復(fù)到上一次git commit的狀態(tài)憨颠。
②若添加到緩存區(qū)后又做了修改,恢復(fù)到上一次git add的狀態(tài)积锅。 -
git checkout -b <分支名>
創(chuàng)建并切換到該分支爽彤,等價(jià)于git branch <分支名> + git checkout <分支名>。
tag管理
git push origin --tags
把本地版本推送到了遠(yuǎn)程代碼倉庫
如果剛剛同步上去,你缺發(fā)現(xiàn)一個(gè)致命bug ,需要重新打版本
git tag -d <某個(gè)具體版本號(hào)缚陷,如V1.2>
這一步只是刪除了本地 V1.2的版本,可是線上V1.2的版本還是存在
這時(shí)我們可以推送的空的同名版本到線下,達(dá)到刪除線上版本的目標(biāo):
git push origin :refs/tags/V1.2
配置設(shè)置
git config
git對(duì)大小寫敏感
git 默認(rèn)對(duì)文件名大小寫不敏感 (不區(qū)分文件名大小寫)
git config core.ignorecase false
為指定命令配置一個(gè)別名适篙,可快速輸入命令。
git config --global alias.命令別名 命令
例如
git config --global alias.st status
:使用git st代替git status
查看公鑰
cat ~/.ssh/id_rsa.pub
箫爷,注意查看是否有空格之類的嚷节,否則公鑰不正確。
遠(yuǎn)程倉庫操作
如何將一個(gè)已存在的目錄轉(zhuǎn)換為一個(gè) GIT 項(xiàng)目并托管到 GITHUB 倉庫?
http://leonshi.com/2016/02/01/add-existing-project-to-github/
git remote
查看全部遠(yuǎn)程倉庫詳細(xì)地址:
git remote -v
查看當(dāng)前遠(yuǎn)程倉庫地址:git remote -v(這個(gè)在不確定當(dāng)前是fork的代碼還是人家的代碼時(shí)很有效)
對(duì)遠(yuǎn)程倉庫進(jìn)行操作:
git remote add <遠(yuǎn)程倉庫名> <遠(yuǎn)程倉庫地址>
多人協(xié)作開發(fā)虎锚,需要相互添加遠(yuǎn)程倉庫硫痰。(這個(gè)具體怎么運(yùn)作去實(shí)際單位實(shí)踐一下應(yīng)該就知道了)
git remote rm <遠(yuǎn)程倉庫名>
當(dāng)某個(gè)開發(fā)者不再貢獻(xiàn)代碼的時(shí)候就可以刪除他對(duì)應(yīng)的遠(yuǎn)程倉庫了。
刪除遠(yuǎn)程倉庫的分支:git push origin --delete develop1
(刪除遠(yuǎn)程倉庫origin的develop1分支窜护,等價(jià)于git push origin :develop1
)
git pull
git pull
= git fetch
+ merge to local
(有時(shí)候git pull會(huì)出現(xiàn)落后于遠(yuǎn)程倉庫的問題效斑,所以先fetch)
提交日志
git log
按照時(shí)間順序顯示所在分支的提交日志git log -g
(這是為了避免代碼回滾帶來的影響。不加-g的提交日志和遠(yuǎn)程倉庫的commit信息是保持一致的柱徙。但是如果有代碼回滾操作缓屠,回滾位置之前的commit logs信息就看不到了)
查看提交日志git log --pretty=oneline
(整潔版本)
解決沖突
git merge
git merge master feature
將master分支合并到feature分支 等價(jià)于
git checkout feature //切換到feature分支
git merge master // 將master分支合并進(jìn)feature分支
git merge --abort
僅僅在合并后導(dǎo)致沖突時(shí)才使用。將會(huì)拋棄合并過程并且嘗試重建合并前的狀態(tài)护侮。
其他
利用gitmoji-cli 來提交帶有 emoji 的commit
gitmoji -i
Initialize gitmoji as a commit hook敌完,這樣每次 commit 會(huì)自動(dòng)打開
gitmoji 提示
gitmoji -r
Remove a previously initialized commit hook
gitmoji -c
交互式提交
git pgp簽署工作
必須首先安裝gpg(GnuPG)(一般用 HomeBrew )
gpg --gen-key
先生成自己的密鑰
生成密鑰的時(shí)候還遇到問題,后來依靠其中的 Thumb 解決概行。
pgp 簽署工作
參考:http://www.ruanyifeng.com/blog/2013/07/gpg.html
疑惑
git pull --rebase
做了什么蠢挡?我的detached HEAD狀態(tài)解除了
參考文獻(xiàn)
Git遠(yuǎn)程操作詳解(有幅圖片很棒)
https://github.com/geeeeeeeeek/git-recipes/wiki/
http://www.worldhello.net/gotgit/index.html
bitbucket git教程