玩转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/master

git 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
上一篇:git 由http切换成git


下一篇:《SSM框架实战》 整合 Freemarker