代码仓库的管理是开发中非常重要的事情之一, 尤其是在一些大项目或者和第三方接触频繁(发版)的时候,版本的控制就越显得重要,工欲善其事,必先利其器.
下面这些是我平时自己工作中要用到的一些git命令,有的人喜欢用gui操作,有的人喜欢用命令行. 这仅仅是喜好习惯问题. 当然这些命令也不是我原创的,也都是在使用中学习和查找然后自己总结的一些常用命令. 基本上能够满足平时的工作需要.
#0x01.创建本地分支
创建一个本地分支
git branch new_branch
##0x02.创建远程分支
创建一个远程分支
把刚才创建的分支推到服务器,如果远程没有则直接创建分支,命令如下:
git push <远程主机名> <本地分支名>:<远程分支名>
git checkout new_branch #切换到新分支
git push origin new_branch:new_branch #如果远程分支名和本地分支名同名则可以省略:和后面的分支名
or
git push origin new_branch
#0x02.切换分支
切换分支命令:
git checkout branch_name
创建和切换分支一起操作<可以不带commit_id>
git checkout -b new_branch #基于当前分支创建并切换到new_branch分支上.
or
git fetch origin #追踪origin分支
git checkout groups #切换到groups上
or
git fetch origin #追踪origin分支
git checkout --track origin/group 切换并建立追踪关系
基于tag checkout
git checkout -b new_branch tag_name
#0x03.拉取远程分支
如果本地没有对应的分支,则先创建.
git fetch #获取分支信息
git checkout -b local_branch origin/remote_branch 创建并切换到新分支上
拉取远程分支最新的更新.
git pull origin remote_branch
#0x04.提交更新到远程分支
命令:
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin new_branch:new_branch #如果分支名相同则省略掉:和后面的分支名
or
git push origin new_branch
强制push
git push -f origin new_branch
#0x05.删除分支
- 0x01.删除本地分支
git branch -d new_branch
- 0x02.删除远程分支
先切换到其它分支,然后再删除new_branch的远程分支.注意:前的空格.
git push origin :new_branch
#0x06.修改分支
- 0x01.查看当前没有提交的修改内容
git status
- 0x02.添加到缓存
git add . #添加当前分支的所有的修改
or
git add *.java #添加当前分支的所有java文件
- 0x03.提交修改
git commit -m "注释信息"
-
0x04.merge
把A分支上的提交commit_id,合并到当前分支上.
git merge commit_id
- 0x05.cherry-pick
把A分支上的提交commit_id,合并到当前分支上.
git cherry-pick commit_id
- 0x04.推送到远程分支
git push origin new_branch
#0x06.回滚
版本回退
- 0x01.根据commit_id来回退
如果错误提交了某个文件,想回退该文件,失误操作之前的一个commit_id,通过reset命令撤销,并重新提交,这样就从公共库中撤销了该文件的提交,但是本地又保留了修改;
git reset <tag/branch/commit id>
git commit -m "revert change in filename"
- 0x02.取消merge
git reset --hard ORIG_HEAD //回退到merge前的代码
- 0x03.取消多次commit:
git reset HEAD~num <-soft/-hard> //取消前num次的commit
or
git reset --hard HEAD~3 //把最近的三次提交都撤销,下次git提交时被删掉.
–soft: staged snapshot 和 working directory 都未被改变 (建议在命令行执行后,再输入 git status 查看状态)
–mixed: staged snapshot 被更新, working directory 未被更改。【这是默认选项】(建议同上)
–hard: staged snapshot 和 working directory 都将回退。
- 0x04.将文件从stage(追踪的库)中移除:
git reset HEAD
git reset --hard HEAD
>放弃工作区和index的改动,HEAD指针仍然指向当前的commit,因为没有commit的改动只存在于index和工作区.
git reset --hard HEAD^ 等价于 git reset --hard HEAD~1
>撤销前一次提交,同时HEAD指针指向前一个commit对象.
如果错误提交了某个文件,想回退该文件,同时本地不需保留修改彻底废弃,commit_id为错误提交的id
git revert -n commit_id
or
git revert commit_id
这次撤销也会作为一次提交进行保存.
-n(–no-commit)参数,表示仅将revert的修改体现在当前的working tree,不自动进行提交.
重要
如果错误提交了某个文件,想回退该文件,同时本地不需保留修改彻底废弃,不带filename则所有的提交都撤销
git revert是创建一个commit来覆盖当前的commit,指针向后移动.
git revert HAED~2
//通过新建一次commit的方式来撤销上一次的commit的修改.因为它不会修改commit history,所以是安全的.
git reset是指向原地或者向前移动指针.
#0x07. 查看命令
- 0x01.查看当前所有的远程分支
查看所有的远程分支
git remote show origin
查看到拉到本地后的.
git branch -a
- 0x02.查看某个文件的修改记录
git log filename //可以看到fileName相关的commit记录
git log -p filename //可以显示每次提交的diff,只看某次提交中的某个文件变化,可以直接加上fileName
git show commit_id filename
- 0x03. 查看某个commit的修改内容
git show commit_id
- 0x04. 查看当前修改和版本库中的差异
git diff
- 0x05. 查看文件和上一个版本的修改差异<详细信息>
git blame
- 0x06. 查看提交记录并显示每次提交修改的文件
git log --stat
- 0x07. 查看已经add的文件和版本库中的差异
git diff --cached
- 0x08. 显示信息命令
git ls-files -u //显示冲突的文件, -s是显示标记为冲突已解决的文件
git diff //对比工作区和stage文件的差异
git diff --cached //对比stage和branch的差异
git ls-file --stage //检查保存在stage中的文件.
- 0x09. 显示提交日志
git log -p -2 //对比最近两次的commit对象
git log -1 HEAD
git log --stat commit_id //查看该对象记录.
#0x08.更新
- 0x01.更新所有的branch:
git remote update //如果远程仓库的branch很多,那么必然拉取失败.
- 0x02.强制覆盖存在的分支
git branch --force exist_branch
git branch -d/-D new_branch //删除分支,大些标示强制
git branch (-m | -M) <old_branch> <new_branch> //重命名分支
#0x09.处理冲突
- 0x01. 使用stash
当前本地修改和远程代码冲突后,先把本地压栈,pull之后再弹栈<有冲突就单独处理冲突>
把当前修改压栈
git stash
从远程pull代码并且合并修改冲突,然后再把本地的修改pop出来.
把当前修改弹栈
git stash pop
- 0x02. 使用checkout
放弃当前的修改重新checkout所有的java文件覆盖当前的修改
git checkout *.java
#0x10.删除命令
git rm --cached file //只从stage中删除,保留物理文件. 不跟踪某个文件 .gitignore
or
git rm --cached -r filepath //不追踪某个目录(不要忘记.gitingore中忽略掉filepath)
git rm //不但从stage中删除,同时删除物理文件.
git mv //把a名字改为b;
实际上git pull命令等价于:
git fetch origin //拉去远程分支到本地
git merge origin/new_branch //合并本地分支和远程分支####拉取远程分支,并与本地分支合并
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
git fetch<远程主机名><分支名>比如,取回origin主机的master分支。
git fetch origin master
在本地分支上合并远程分支
git merge origin/master or git rebase origin/master
#0x11 .标签
- 0x01.创建标签
1.git add .
2.git commit -m “fixed some bugs”
3.git tag -a 0.1.3 -m “Release version 0.1.3″
- 0x02.推送到远程
1.git push origin master
2.git push origin –tags
>*–tags参数表示提交所有tag至服务器端,普通的git push origin master操作不会推送标签到服务器端
-
0x03. 删除那个同名的TAG
git tag -d V4.4.3 -
0x04. 删除远端服务器的标签
git push origin :refs/tags/V4.4.3 -
0x05. 根据tag checkout代码
先 git clone 整个仓库,然后 git checkout tag_name 就可以取得 tag 对应的代码了。
git checkout tag_name
但是这时候 git 可能会提示你当前处于一个”detached HEAD” 状态,因为 tag 相当于是一个快照,是不能更改它的代码的,如果要在 tag 代码的基础上做修改,你需要一个分支:
git checkout -b branch_name tag_name
这样会从 tag 创建一个分支,然后就和普通的 git 操作一样了.
#0x12 .处理.gitignore
git rm –cached FILENAME or
git rm -r –cached FOLDERNAME 然后commit,push
Git rm – 如何使文件脱离git的版本管理,但不是会删除它.
Git rm命令将允许你取消git对文件的版本控制. 这个 –cached选项允许你把文件保留在你的硬盘上.每隔一段时间都会有一些不应该被git管理的文件被误加入到git中. 常见的例子是配置文件, 由包含你的个人设置的IDE生成的工程文件,甚至有人决定要签入的临时文件. 这些文件是必要的, 所以往往不能完全删除它们。然而将它们复制到其他地方, 或者从git中删除然后替换它们,这一过程是非常痛苦的, 更别提容易出现的错误.通过添加 –git rm 命令的缓存的选项, 你是能到远程文件文件从 git 控制同时保持工作树中的文件. 他们命令的语法是:
git rm –cached file
Git 将不再跟踪此文件,尽管它仍然是在您的硬盘上.运行上述命令后, 一定要添加一个条目到您 .gitignore 文件以便 ’ 文件’ 没有显示在 ’ git 状态’ 和,它不小心以后将无法重新添加.
#0x13. 修改之前提交的commit内容
- 0x1. 刚刚commit还没有push
git reset HEAD^
git commit -m "New commit message"
git commit --amend -m "New commit message"
- 0x2. 已经push到远程的分支,但是别人还没有做提交
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
- 0x3. 已经push而且已经产生别人的提交记录
git checkout -b tmp ^xxx
git cherry-pick xxx
git commit --amend
git cherry-pick <依次后面的提交id>
其它issue:
Switched to branch ‘V6.1.0’
Your branch is ahead of ‘origin/master’ by 1 commit.
(use “git push” to publish your local commits)
solution:
git push origin HEAD:master
issue:
Git 2.0 from ‘matching’ to ‘simple’. To squelch this message
and maintain the traditional behavior, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
solution:
git config push.default simple