在工作之中使用git,除了常用的clone,add,commit,push,fetch,pull,merge等还会经常出现一些其他需要解决的问题,现在将其总结下。
可以在我的博客http://haiyangjiajian.com/交流更多相关内容。
1. 忘记添加.gitignore
GIT新手最容易犯的一个错误就是没有添加.gitignore,而把不该上传的东西上传了, 而GIT老手有时会因为在规则里面写了个.*而导致.gitignore没有加入到版本控制当中, 事后才发现,但此时项目中已充斥了“垃圾”。
此时项目管理者才追悔莫及,修改.gitignore并提交到版本控制当中。 但大错已铸成,新添的.gitignore不会影响已经加入到项目中的文件,GIT老手此时也可能没有什么好办法, 只能把不该有的东西手动删除掉,再重新提交。但更麻烦的是,这些“垃圾”可能还有用, 如Java项目中依赖的一些*.jar库文件,直接删了会出问题,要在修好项目后重新加回来。 如果只有几个文件还好,如果成百上千,这样操作,一天都不用干别的了。
但问题总会有聪明办法解决。GIT中用git rm --cached xxx可以在不动项目当前工作空间的情况下, 将文件从当前(未提交)版本中移除。如此而来简单方法就出来了:
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将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。
方法2:
- 在本地git revert,覆盖掉上一次的commit
- git push origin "your branch name"
3. git reflog
git reflog/git log -g记录每次修改head的操作,可以查看所有历史修改记录,然后通过git reset命令进行恢复
4. git merge和git rebase
如果需要merge远程分支的东西,尽量不要用git pull。 可以使用:
git fetch origin
git rebase origin/master // 可以理解为:将服务器master分支映射到本地的一个临时
//分支上,然后将本地分支上的变化合并到这个临时分支,然后再用这个临时分支初始化本地分
//支
5. git stash
git stash 将未commit改变缓存,不保存新加的文件
git stash list 展示栈列表
git stash apply {stash@{2}} 应用某次栈中的内容
git stash pop 应用栈顶内容并弹栈
git stash clear 清空队列
6. git revert和git reset
git revert是用一个新的提交取消掉了之前的一个错误提交
git reset取消掉最近一次commit后add的
git reset []回到那一次commit,并且将撤销掉的文件的提交恢复成未提交的状态
git reset --hard 回到那一次commit,所有过程中的文件都没了
7. git自动补全
8. 单独统计每个人的增删行数
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