你通常用git diff来找你当前工作目录和上次提交与本地索引间的差异。
$ git diff
上面的命令会显示在当前的工作目录里的,没有 staged(添加到索引中),且在下次提交时 不会被提交的修改。
如果你要看在下次提交时要提交的内容(staged,添加到索引中),你可以运行:
$ git diff --cached
上面的命令会显示你当前的索引和上次提交间的差异;这些内容在不带"-a"参数运行 "git commit"命令时就会被提交。
$ git diff HEAD
上面这条命令会显示你工作目录与上次提交时之间的所有差别,这条命令所显示的 内容都会在执行"git commit -a"命令时被提交。
你可以用 git diff 来比较项目中任意两个版本的差异。
$ git diff master..test
上面这条命令只显示两个分支间的差异,如果你想找出‘master’,‘test’的共有 父分支和'test'分支之间的差异,你用3个‘.'来取代前面的两个'.' 。
$ git diff master...test
当有几个commit时,合并为一个commit然后提交到远程的方法:
checkout 到commit所在分支,例如ticket-123123
git checkout ticket-123123gitk 图形化界面查看目前有几个commit要合并, 假设为3
git rebase HEAD~3 --onto origin/develop
onto后面为要提交的远程分支
此时会显示
First, rewinding head to replay your work on top of it...
Applying: refs# 172198 fix Japanese project announcement notification refs #172198
Applying: refs# 172198 fix Japanese project announcement notification refs #172198
Applying: refs #172198 fix Japanese project announcement notificationgitk查看状态
git rebase -i HEAD~3
在其中,把要合并过去的(新的)分支前的选项改为s或squash, 最早的commit 前的选项保留位pick,即:
pick xxxxx messages...
s yyyyy messages...
s zzzzzz messages...
其中zzzzz是最新的commit,xxxxx是最早的commit
改完之后显示更改信息:
[detached HEAD aec7724] refs #172198 fix Japanese project announcement notification
Date: Wed Jan 4 11:08:34 2017 +0800
3 files changed, 3 insertions(+), 17 deletions(-)
delete mode 100644 company-timeline-version-up/src/main/resources/cassandra/data/framework/TextDefDto/20161229142900_INSERT_com.worksap.company.hue.core.dto.TextDefDto.json
delete mode 100644 company-timeline-version-up/src/main/resources/cassandra/data/framework/TextDefDto/201701041026172198_INSERT_com.worksap.company.hue.core.dto.TextDefDto.json
create mode 100644 company-timeline-version-up/src/main/resources/cassandra/data/framework/TextDefDto/20170104172198_INSERT_com.worksap.company.hue.core.dto.TextDefDto.json
Successfully rebased and updated refs/heads/ticket-172198.最后push
git push origin ticket-172198 -f
会显示成功信息:
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (11/11), 987 bytes | 0 bytes/s, done.
Total 11 (delta 1), reused 9 (delta 0)
To git@scm.hue.workslan:company/collabo-verup-files.git
- 776dc7a...aec7724 ticket-172198 -> ticket-172198 (forced update)
参考ref
http://www.jianshu.com/p/964de879904a
http://www.jianshu.com/p/4f1bad9e0a2d
重新在远程建新分支
先切换到远程develop
git checkout origin/develop
然后建一个新分支newbranch2
git checkout -b newbranch2
如果是空的,直接push,相等于覆盖
git push origin newbranch2
把自己的修改代码保存,在ticket分之下,checkout一个新的备份分支就可以
git checkout -b ticket-xxx-backup
然后切回ticket分支,rebase到新分支上去,有几个commit 参数就是几
git rebase HEAD~1 -- onto newbranch2
最后push,如果已经push过,就加-f参数
git 切换到远程tag
git fetch origin tag <tagname>
git checkout <tagname>
git通过rebase,形成一条线
https://segmentfault.com/q/1010000000430041
对应到我司工程:
git fetch origin <branchName>
git rebase HEAD~n -- onto origin/branchName
git push ticket-xxxxxx
git 把本地分支branch1更新到最新
如果本地没有改动,也不用fetch merge了
先git fetch origin branch1
再切到一个别的分支上
把本地分支删除
git branch -D branch1
git checkout origin/branch1 -b branch1
或者直接fetch origin 再git rebase origin/branch1
**** 如何合并两个仓库****
假设现在有两个repo:repo1,repo2,每个repo中都已经有一堆提交记录了,现在想把repo2中的记录合并到repo1中,命令如下:
cd repo1
git remote add other ../repo2
git fetch other
git checkout -b repo2 other/master
git checkout master
git merge repo2
解释:
进入repo1文件夹
添加repo2作为repo1的远程仓库,并命名为other
将repo2的内容获取到repo1注意,使用fetch而不是pull,关于fetch和pull的区别[请戳这里](https://stackoverflow.com/questions/292357/what-are-the-differences-between-git-pull-and-git-fetch)
在repo1中创建名为repo2的新分支,同时切换到该分支,并且使用上一步获取的内容中的master分支的内容
切换到repo1的master分支
将repo2分支的内容合并到master分支
[](http://sabrinaluo.com/tech/2015/12/24/how-to-merge-repos-with-git/#一句话总结)一句话总结
将一个仓库的内容checkout到另一个仓库的一个分支,将该分支与master分支合并
注:不一定是master,可以是任意你要合并过去的分支。
## 强制批量删除本地分支
git branch | grep 'matched branch name' |xargs git branch -D