在工作之中使用git友酱,除了常用的clone,add柔纵,commit缔杉,push,fetch搁料,pull或详,merge等還會經(jīng)常出現(xiàn)一些其他需要解決的問題,現(xiàn)在將其總結(jié)下郭计。
可以在我的博客http://haiyangjiajian.com/交流更多相關(guān)內(nèi)容霸琴。
1. 忘記添加.gitignore
GIT新手最容易犯的一個錯誤就是沒有添加.gitignore,而把不該上傳的東西上傳了昭伸, 而GIT老手有時會因為在規(guī)則里面寫了個.*而導(dǎo)致.gitignore沒有加入到版本控制當(dāng)中梧乘, 事后才發(fā)現(xiàn),但此時項目中已充斥了“垃圾”庐杨。
此時項目管理者才追悔莫及宋下,修改.gitignore并提交到版本控制當(dāng)中嗡善。 但大錯已鑄成,新添的.gitignore不會影響已經(jīng)加入到項目中的文件学歧,GIT老手此時也可能沒有什么好辦法, 只能把不該有的東西手動刪除掉各吨,再重新提交枝笨。但更麻煩的是,這些“垃圾”可能還有用揭蜒, 如Java項目中依賴的一些*.jar庫文件横浑,直接刪了會出問題,要在修好項目后重新加回來屉更。 如果只有幾個文件還好徙融,如果成百上千,這樣操作瑰谜,一天都不用干別的了欺冀。
但問題總會有聰明辦法解決。GIT中用git rm --cached xxx可以在不動項目當(dāng)前工作空間的情況下萨脑, 將文件從當(dāng)前(未提交)版本中移除隐轩。如此而來簡單方法就出來了:
git rm -r --cached .
git add .
git commit -m ".gitignore is now working"
2. git 取消push
方法1:
- git reset --hard HEAD~1
- 然后再使用git push origin "your branch name" --force將本次變更強行推送至服務(wù)器。這樣在服務(wù)器上的最后一次錯誤提交也徹底消失了渤早。
方法2:
- 在本地git revert职车,覆蓋掉上一次的commit
- git push origin "your branch name"
3. git reflog
git reflog/git log -g記錄每次修改head的操作,可以查看所有歷史修改記錄,然后通過git reset命令進行恢復(fù)
4. git merge和git rebase
如果需要merge遠程分支的東西鹊杖,盡量不要用git pull悴灵。 可以使用:
git fetch origin
git rebase origin/master // 可以理解為:將服務(wù)器master分支映射到本地的一個臨時
//分支上,然后將本地分支上的變化合并到這個臨時分支骂蓖,然后再用這個臨時分支初始化本地分
//支
5. git stash
git stash 將未commit改變緩存,不保存新加的文件
git stash list 展示棧列表
git stash apply {stash@{2}} 應(yīng)用某次棧中的內(nèi)容
git stash pop 應(yīng)用棧頂內(nèi)容并彈棧
git stash clear 清空隊列
6. git revert和git reset
git revert是用一個新的提交取消掉了之前的一個錯誤提交
git reset取消掉最近一次commit后add的
git reset []回到那一次commit积瞒,并且將撤銷掉的文件的提交恢復(fù)成未提交的狀態(tài)
git reset --hard 回到那一次commit,所有過程中的文件都沒了
7. git自動補全
8. 單獨統(tǒng)計每個人的增刪行數(shù)
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done