玩转GIT
git tag
https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE
git tag:查看所有tag
git tag -l 'v2.1.2.20170111.*'
git tag xx:打tag
git show v2.1.2.20170111.3.bgy
git push origin v2.1.2.20170111.3.bgy: 提交tag
git push origin --tags 要一次推送所有本地新增的标签上去
checkout到某个tag:
先 git clone 整个仓库,然后 git checkout tag_name 就可以取得 tag 对应的代码了。
但是这时候 git 可能会提示你当前处于一个“detached HEAD" 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支:
git checkout -b branch_name tag_name
这样会从 tag 创建一个分支,然后就和普通的 git 操作一样了。
git reset/revert 撤销
http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
http://gitbook.liuhui998.com/4_9.html
http://blog.jobbole.com/87700/
git revert 撤销某一个commit
git revert是用一次新的commit来回滚之前的commit
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
通常,前几位即可 git revert c011eb3
git reset 回退代码到指定状态
--mixed 未add的时候
会保留源码,只是将git commit和index 信息回退到了某个版本.
git reset 默认是 --mixed 模式 git reset --mixed 等价于 git reset
--soft add之后
保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
--hard 撤销commit和add操作
源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
特殊场景:当用reset 恢复了远端代码,其他人pull更新本地代码,根本不能感知线上的回退。
解决:执行git reset --hard origin/release/1.2.2,把本地代码强制更新为远程的1.2.2分支最新的状态;
reset远程仓库代码之后没有多出来commit,此时执行pull感受不到远端比本地多出来的变化(没有新的commit),所以不会把远端代码更新到本地;
revert则会产生新的反向commit;
恢复某个文件:
git checkout -- hello.rb
这条命令把hello.rb从HEAD中签出并且把它恢复成未修改时的样子.
远程代码覆盖本地
解决方法:
1、如果还没有 commit 的话,可以用
git checkout .
这样将使所有代码还原到最后一次 commit 的状态
2、如果已经 commit 了,最简单的方法就是,删除当前的工程(注意保存有用的代码到别的地方)
然后使用
git clone https:// ....
重新 clone 远程工程到本地
或者
git fetch --all git reset --hard origin/mastergit reset --mixed HEAD
将你当前的改动从缓存区中移除,但是这些改动还留在工作目录中。
另一方面,如果你想完全舍弃你没有提交的改动,你可以使用git reset --hard HEAD
。这是git reset
最常用的两种用法
git pull 的意思并不是覆盖,而是和远程做一次比对,如果远程代码比本地的新,就把本地代码调整到远程代码最后一次 commit 的状态。而针对问题中的情况,本地代码比远程的新,所以 git pull 不会有任何作用。
版本恢复
版本恢复,本地和远程都恢复到历史提交版本commitid:
git reset -hard 6292d98 #本地恢复到指定版本,git reset --hard HEAD是恢复到最近提交
本地分支强行覆盖远程分支
git push origin master -f #强制用本地分支更新远程分支
http://www.tech126.com/git-reset/#comment-8055下面的评论
删除远程分支
http://zengrong.net/post/1746.htm
git删除远程分支:
如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master
分支(或任何其他存放稳定代码的分支),可以用这个非常无厘头的语法来删除它:
git push [远程名] :[分支名]
。如果想在服务器上删除 serverfix
分支,运行下面的命令:
$ git push origin :serverfix To git@github.com:schacon/simplegit.git - [deleted] serverfix
咚!服务器上的分支没了。你最好特别留心这一页,因为你一定会用到那个命令,而且你很可能会忘掉它的语法。
有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支]
语法,如果省略 [本地分支]
,那就等于是在说“在这里提取空白然后把它变成[远程分支]
”。
git push origin :old_master #master没法删,只能删其他分支,所以这个方法不能用于上面的master分支回滚版本。
http://my.oschina.net/tsingxu/blog/84601
https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF#删除远程分支
删除本地分支
git branch -d <branchname>
比较两个分支的不同
git diff branch_a..branch_b
git自动补全功能
https://i.cnblogs.com/EditPosts.aspx?postid=4422412
按tab键自动补全命令
locate git-completion.bash找到这个文件,在.bashrc中加入source pathto/git-completion.bash
把这个文件复制到系统目录:
$cp git/contrib/completion/git-completion.bash ~/.git-completion.bash
在 .bashrc 中加入:重新进入terminal,或者直接手动执行下;
source ~/.git-completion.bash