git merge的时候总是会有一条git撤销committ message,请问这是操作不当吗

fsjoy1983 的BLOG
用户名:fsjoy1983
文章数:301
评论数:297
访问量:904204
注册日期:
阅读量:3610
阅读量:1729
阅读量:2743
51CTO推荐博文
13325人学习
37381人学习
42522人学习
第四课& 分枝和合并基础知识介绍
内容提要:创建工作分枝,合并分枝以及删除分枝
从第一课的介绍中,我们了解到,git处理分枝和合并是非常独到的。首先,无论是创建新分枝还是分枝之间切换,都表现出一个共同的特征--快! git 有一个独立的工作目录,专门用来存放所有分枝的内容,所以你没必要为每一个分枝再分别创建目录。
这一节,我们的任务是:
1. 创建一个新的分枝;
2.在这个分枝上做一些工作;
3.切换回稳定的主分枝(一般git默认的主分枝名叫master);
4.在主分枝上再做点工作;
5.再切换到刚那个临时分枝完成工作;
6.最后将它们合并成为一个稳定的主分枝。
首先,查看现存的分枝,可以使用不带任何参数的'git branch'命令。
$ git branch* master
可以看到,我们现在只有一个分枝叫做'master',*代表的意思是我们正在这个主分枝上工作。下图是在主分支上的提交历史模型,绿框表示提交,箭头指向的是它的父节点。这就是git提交数据的方式。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/074074.png" border="0" />从图中可以看出,在git中,分枝都是由一些具体的提交点组成。整个分枝的历史都是这样串联起来的,一次只有一个提交点。
创建新的分枝
可以用'git branch (branchname)'命令在当前分枝上创建一个新的分枝:
$ git branch experiment
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/961934.png" border="0" />
为了将我们的工作保存到experiment分枝而不是master分枝上,我们需要切换到experiment分枝上,执行'git checkout'命令:
$ git checkout experimentSwitched to branch "experiment"$ git branch* experiment& master
执行完毕后,我们就切换到了新的分枝(experiment)分枝上,看到experiment前面有了*号了。现在,我们修改文件、提交就不用再担心跟master分枝混在一起了。也没必要在我们确定一切搞定之前,将experiment分枝上的变更共享了。
在多分枝上进行工作
现在,让我们添加一个TODO文件,并修改simplegit.rb文件,然后将这些变更都提交。
$ vim lib/simplegit.rb$ vim TODO$ git add TODO$ git commit -am 'added a todo and added simplegit functions'[experiment]: created 4682c32: "added a todo and added simplegit functions"&2 files changed, 10 insertions(+), 0 deletions(-)&create mode 100644 TODO
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/009793.png" border="0" />
现在,我们来看一下,整个项目中有3个文件和一个子目录。
$ lsREADME&&Rakefile&TODO&&lib
然后,我们假设需要回到原始版本来调试simplegit.rb文件。
$ git checkout masterSwitched to branch "master"$ lsREADME&&Rakefile&lib
可以看到我们已经回到了master分枝,工作目录中也没有TODO文件,这是因为master分枝上我们就没有创建过这个文件。
如果现在我们再切换到experiment分枝,我们又会看到TODO文件,并且simplegit.rb也是我们在experiment修改后的内容。
下面这段代码是在master分枝上修改simplegit.rb文件,在文件内添加一个commit function.提交,然后再切换到experiment分枝。
$ vim lib/simplegit.rb $ git commit -am 'added a commit function'[master]: created 0b7434d: "added a commit function"&1 files changed, 4 insertions(+), 0 deletions(-)$ git checkout experimentSwitched to branch "experiment"$ lsREADME&&Rakefile&TODO&&lib
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/063106.png" border="0" />
很多使用git的开发者通常会同时拥有很多个分枝,每一个分枝上都会进行着某个具体功能的开发,这些开发可能持续几分钟、几小时,也可能长时间的在某个分枝上进行大规模重构的工作,并定期的将其合并到主分枝上。
如果你需要在一个长期工作的分支上与其他开发者进行协作,你可以将这个分枝上传到共享服务器端。譬如,如果你想跟某人共享experiment分枝,你可以这样:
$ git push origin experiment
让你的合作伙伴同步这个分枝,然后与你协同工作。当然你也可以自己保留这些分枝作为自己的工作分枝--不用上传就可以了。
合并和移除无用分枝
当你在一个分枝上完成你的工作了,这时,如果你觉得所做的工作没什么意义,那么你可以忽略它并且将其移除;相反,你应该将这些工作合并到一个你会长期使用的分枝中(一般来说,开发者会用'master'分枝来存放稳定的代码,并行的'develop'分枝用来整合或测试变更的内容,或者将一些短期的分枝合并进来)。
合并分枝的方法:首先切换到想要合并到的分枝下,运行'git merge'命令,(例如本例中将experiment分枝合并到master分枝的话,进入master分枝运行git merge experiment命令)如果合并顺利的话:
$ git merge experimentAuto-merging lib/simplegit.rbMerge made by recursive.&lib/simplegit.rb |&&& 1 +&1 files changed, 1 insertions(+), 0 deletions(-)
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/909028.png" border="0" />
合并冲突处理
然而,有时候合并并不一定会顺利进行,如果碰到了问题,就会出现下面这些内容:
$ git merge experimentAuto-merging lib/simplegit.rbCONFLICT (content): Merge conflict in lib/simplegit.rbAu fix conflicts and then commit the result.
这种情形下,提示合并冲突,你可以通过下面的方式来解决:打开提示冲突的文件,会看到冲突标记:
&&&&&&& HEAD:lib/simplegit.rb& def commit(message)&&& command("git commit -m '#{message}'")=======& def add(path)&&& command("git add #{path}")&&&&&&& experiment:lib/simplegit.rb& end
修改完成之后,运行'git add'重新载入(re-stage)这个文件,然后合并:
$ git add lib/simplegit.rb$ git commit[master]: created 6d52a27: "Merge branch 'experiment'"
这个问题之所以重要是因为在其他的VCS工具中多次合并实现起来是很麻烦的,但是用git,很容易解决。合并一个分枝之后,再继续在这个分枝上工作,然后再合并。这种情形一般是这样的:如果你有一个'development'分枝,你正在进行集成测试、合并实验中的变更,然后定期的将其合并到稳定的'master'分枝中。
用我们正在进行的例子来讲,假如我们现在又切换到'experiment'分枝,做点小小的改动,然后再将其合并到'master'分枝中,整个的过程大致是这样:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)' alt="" src="/attachment/506012.png" border="0" />
因为git合并是基于提交历史的快照,所以多次合并显得so easy。当你在一个分枝上做完你的工作之后,譬如例子中的'experiment'分枝,那么我们只需使用'git branch -d'命令即可删除此分枝
$ git branch -d experiment
如果分枝还没有被合并,那么执行这个命令就会将分枝上所做的工作一并删除,git是不允许你这么干的。如果你实在想删除的话,那么使用'-D'参数强行删除吧。
这就是git中分枝和合并的所有内容,我想你理解了git的这一功能之后会觉得它确实是个非常棒的工具了。
了这篇文章
类别:┆阅读(0)┆评论(0)1554人阅读
想了很久,也不知道该如何下笔,那就从基本的概念说起吧。(下面如果没有特别说明,那么都是指在Unix下面使用GIT。)
GIT所设想的一个工作场景是这样的:
在写代码的过程中,我们会不断对我们正在做的项目进行完整的备份,这样,就算改错了什么东西,我们可以很容易的从某个备份点重新开始。然后,我们还需要能比较我们当前开发的内容和备份内容的差别(diff),这样,我们就可以方便把代码差异打包(patch)发给别人进行审核(review)。
于是GIT就是这么一个工具,让这个流程自动化,并且提供了其他相关的强大功能。当然GIT实际上并不是每次对项目进行完整的备份,它有自己的另外一套更好机制来达到相同效果,而在GIT中每一次保存一个改动(commit)的时候,它的理念就是保存一个项目的当前的状态,称为快照(snapshot)。而我们可以通过任何一个snapshot很方便的取回(或部分取回,比如只是某个文件)项目当时的状态。
这是GIT的核心概念,要想运用好GIT,理解这个概念是非常重要的。
Repository
要使用GIT管理一个项目的时候,就需要一个仓库(repository)用于存放GIT对项目管理所必须要保存的各种文件,使用 git init 命令创建一个新的仓库。GIT会在当前目录下创建一个.git文件夹,用作仓库。然后,当你使用GIT记录每一次代码改动的时候,GIT就会把需要的信息都放到这个文件夹下面。
在使用GIT的时候,一般是还要配置一个用户名和邮件地址,这不是注册GIT账户,而是在你commit a change的时候,要有个作者的信息。通常来说,加一个全局的信息就可以了:
git config --global --add user.name Edward
git config --global --add user.email
或者你可以选择直接编辑~/.gitconfig,这个文件看起来是这样的:
&&&&email =&
&&&&name = Edward
每当你完成一个改动(change)的时候,就可以commit一下,记录当前项目的情况(snapshot)。每一个commit包含如下信息:
commit-id(sha-id):这是一个通过sha-1算法算出来的一个id,它不只作为每个commit的唯一识别码,也可以用来验证保存的代码是否损坏。所以在GIT在管理代码的时候,如果发生代码损坏,可以很有效的检测到。author:作者date: 日期时间log messge:一段作者对代码改动的文字描述。change-id:如果是和repo、gerrit一起使用的话,repo会加上这个信息,以便在整个代码系统中识别同一个改动的多个版本。
用代码管理软件管理代码的时候,有个理念就是:每次改动提交以后,整个项目都应该是可以工作的。所以,每次commit最好都能是这样的的改动,虽然这不是必须的,但是这样对项目整体质量的提高很有好处。
在GIT使用中,一个change开发的常见工作流程大概是这样的:
新建一个工作分支(topic branch)
作一些代码改动
查看当前状态(很常用!):git status 查看当前branch以及那些文件有改动;git diff 查看目前为止的详细的改动情况。
git add xxx 将这些改动暂时归档。在很多时候,一个change包含的东西并不少,我们在做到一半的时候通常也需要暂时保存一些东西。使用git add会将指定的文件的现有改动暂时保存下来(这个暂时归档的地方,GIT称它为staging area,可以认为是一个临时的snapshot。顺便说一下HEAD,在GIT中,HEAD总是指向项目当前状态最近的一次正式的snapshot。)。git
add . 会将所有改动暂时归档。
git reset xxx 将某个文件从staging area中移出来。git reset 不带参数的时候,就是将staging area中所有的文件移出。
查看staging area中的详细改动:git diff --cached
继续写代码,git add xxx 将新的改动归档。
当你发现你的改动非常不合理,想要取消这些改动的时候:git checkout xxx 将某个文件恢复到修改之前(最后一次snapshot)。git checkout . 会恢复所有的文件到修改之前的状态,很方便的功能,但使用的时候一定注意,不要让自己的心血付诸流水。
重复上面的步骤,直到你认为你的改动已经可以作为一个有效的change,那你就可以执行 git commit 来将当前的改动真正的保存下来。记得在commit message里面写上适当的描述信息,这样在查看代码历史的时候,就能方便的知道每个change都干了些什么。
有时候,你commit以后,你还发现还有需要修改的地方(特别是让别人review的话,commit之后需要多次改动也是很常见的事情),那么你就重复上面的步骤,不过在最后commit的时候加上 --amend 参数,这样,它就会将目前的修改内容添加到最近的一次commit。如果忘记/误用了 --amend 参数的时候怎么办呢?只要在编辑commit message的时候把内容全部清空,保存退出,GIT就会放弃这次commit。
根据情况,将这个改动合并(merge)回原来的主分支
经过上面的流程(某些步骤会不断的重复),那么一个有效且高质量的change就完成了。通过上面的这些步骤我们可以看出,在使用GIT来管理代码的时候,我们可以很容易的在任何时候保存我们想要保存的项目状态,并且可以很容易的取消某些文件的改动。这样,我们修改代码的时候,可以更随心所欲的进行修改,只要我们采取了适当的行动,我们就不怕半途丢失了我们的成果。当然,你必须要对上面每一个步骤都很熟悉,才能有随心所欲的感觉。
在git中,每一个commit都是一个项目当时的snapshot,tag的作用就是给commit打上标签。比如你当项目进行到某一点,你觉得可以发布(release)一下,那你就可以在这个位置做一个标记,打一个tag,一个发布点就被明确的标示出来了,这样可以方便的对项目的情况进行管理。我通常把它理解为某个commit的别名。GIT对项目的版本管理通常就是在这里体现的。由于tag通常是用于项目发布管理的,所以通常是项目管理人员来使用它。
查看tag情况:git tag
新建一个tag:git tag &tagname& &commitid&
删除一个tag:git tag -d &tagname&
查看帮助:git tag -h
GIT最方便的莫过于本地分支(branch)的使用了。就开发来讲,你需要尝试你的各种想法,就发布项目来说,不同的branch可以让你有效的管理各个版本软件的发布以及维护。这里只说说开发。
查看branch:
git branch命令就可以查看本地当前的所有branch。常用的参数有:
-r 查看远程(remote)的branch
-a 查看(本地+远程)所有branch
-v 查看branch的时候显示每个branch的最后一个commit信息
跳转到一个branch:
你任何时候只能在某一个branch上面,或者某一个特定的snapshot。
git checkout branchname 跳转到某一个branch
git checkout sha1/tag 跳转到某个指定的snapshot,这是你不在任何一个branch上面。
新建一个branch:
git branch newbranch 从项目当前所在的commit创建一个branch
git checkout sha1/tag -b newbranch 从某一个指定的snapshot创建一个新的branch,并跳转到新建的branch
git checkout remote_branch -b newbranch 以某个远程branch最新的一个snapshot为基础创建一个新的branch,注意这不会影响远程branch,因为他的实质和上面其实是一样的。
那么我们该如何使用branch呢?首先,你要知道GIT是个分布式的代码管理工具,在你没有和远程代码仓库交流的时候,你的任何改动都是本地的,不用担心影响到远程代码仓库。而你只要不刻意去破坏你本地的仓库,那么,就大胆的使用branch吧,做各种尝试。任何时候你有一个新的想法,在本地建一个branch尽情的去尝试,很快你就会喜欢上这东西的。
如果是个多人协作项目的话,通常你的工作并不只是改动一个地方,那么当你完成了某一个change正在等待review的时候,你就可以新起一个branch,接着就开始你的另一个change了。
有了分支你就可以尽情的做各种尝试,随心所欲的写代码。但我们通常是有一个主干分支,然后我们把每个成熟的改动的合并(merge)到我们的主干,这样,项目才真正有效的在前进。这个工作流程就完美的解决了多人协作开发项目的问题:因为每个人都是在自己的本地工作区进行修改,互不影响,在完成后将自己的成果放进主仓库(某个remote repository)就可以了,最坏的情况就是可能会有些代码冲突,但代码冲突通常并不是什么很难解决的问题:毕竟在分配任务的时候就会有大致进行安排,所以一般是不会有什么无法解决的冲突。
说到merge的话,很多时候有人就会和rebase搞混。虽然两个命令的功能都是把两个branch合并起来,但是还是有很大差别的。
rebase主要用于如下情形:在多人协作的项目中,当你完成了一个改动以后,你发现别人已经在远端主代码仓库添加了很多改动了,这时候很可能会有代码冲突,或者已经有代码冲突,那这时候,你就需要把你当前的工作branch更新到最新的状态,然后解决代码冲突,然后再提交你的change。这时候,你就:
从远端获取最新的代码
git rebase xxx 更新你当前的branch到最新状态,然后把你的代码改动放在最上面
向远端提交代码
而merge的话,就只是简单的将两个branch合并,如果出现GIT无法处理的冲突的时候,那么就先采取上面的步骤,然后在merge。在Android的工作环境中,我们通常是不需要使用merge这个操作的,这个操作是在gerrit里面完成review以后,点merge按钮来完成的。
最常用的查看项目历史(实际上是某个分支的历史)的命令就是git log,常见用法如下:
git log 查看项目从当前位置(最近一个snapshot)之前的历史记录。可以这么来理解:当你在某个branch上面的时候,这个snapshot就是当前分支的最新的一个comit,当你不在一个branch上面的时候,就是当前情况下最新的那个commit。git log shaid/tag 同上,不过指定了snapshot的位置git log file_name 同上上,不过查看的是特定文件相关的改动记录git log branch 查看特定branch的历史记录git log branch file_name 同上,不过查看的是特定文件相关的改动记录git log --no-merges 由于GIT在进行merge的时候,会自动生成一个merge的commit,但其实这个commit本身是没有内容的,--no-merges这个参数的作用就是在查看log的时候忽略这种commit。
这个命令可以满足大部分需要查询历史记录的情况,但有时候,你需要一个更强大的工具,那就是GITK。在当前branch下面,使用gitk命令,就可以使用gitk查看当前项目状态之前的历史记录。它是一个有界面的工具,基本上是一目了然的,所以我也不过多的介绍,花几分钟去试试它吧。
GIT既然是分布式代码管理工具,那么就必然涉及到远程的交互了。GIT和远端的交互可以通过常见的HTTP、HTTPS,在比较正式的项目中,通常是基于SSH的GIT协议。
以为例,上面支持3种方式:
HTTP:只是从服务器上下载代码HTTPS:需要登录,可以下载和上传代码,但上传代码的时候需要每次登录SSH:配置好以后,GIT会自动采取SSH验证关于SSH的配置,这是github上面关于如何配置SSH的帮助:
在Android系统的管理中,由于和服务器的交互都是封装在repo这个工具里面,所以,通常是不需要用到remote操作的。所以只简单说一下:
git remote 查看当前已添加的远程服务器
git remote -v 同上,不过显示更详细的信息
git remote -h 查看帮助
.gitignore
在开发一个项目的时候,有时候总会有些项目无关的文件,比如bin文件夹下面的内容,一般是不需要用GIT管理起来的。这时候,你就把这些文件的信息写到.gitignore里面,然后,把.gitignore的改动使用GIT管理起来,这样,GIT在查询状态的时候,就会忽略在.gitignore里面提到的文件。
color & alias
GIT可以给各个命令的输出结果加上适当的颜色以提高视觉识别度,只需要简单的配置即可。如果你嫌有些GIT命令太长,每次打完太麻烦,没关系,有办法,添加别名。
因此我通常会在我的/etc/gitconfig文件中加入如下的内容:
&&&&ui = auto
&&&&st = status
&&&&cm = commit
&&&&cma = commit --amend
&&&&br = branch -v
&&&&cp = cherry-pick
&&&&co = checkout
&&&&df = diff
&&&&dfc = diff --cached
如何使用alias:以第一个为例,当我想用git status的时候,我打git st就可以了。
GIT的功能很丰富,上面说的这些不过是一些常用的功能而已,要想把每个细节都说清楚的话,还远远不够。想要用好GIT,还需要在实际运用中进行实践和进一步学习。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20249次
排名:千里之外
原创:23篇
评论:17条
(1)(2)(2)(4)(2)(4)(3)(2)(1)(4)(1)git详细教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
234页4下载券26页免费10页免费13页免费20页免费23页免费10页免费9页免费29页免费19页免费
喜欢此文档的还喜欢23页免费112页免费14页免费241页免费13页免费
git详细教程|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢12个git实战建议和技巧
查看: 1361|
评论: 0|来自: CSDN
摘要: 1.使用“git diff”来折叠多行用git diff经常会出现很多内容,导致很多内容被遮住了,让人很是苦恼,幸运的是这里有个解决方案。如果你使用less作为默认的pager,只需要输入-s,就可以保证不会被diff刷屏了。或者, ...
1.使用“git diff”来折叠多行用git diff经常会出现很多内容,导致很多内容被遮住了,让人很是苦恼,幸运的是这里有个解决方案。如果你使用less作为默认的pager,只需要输入-s,就可以保证不会被diff刷屏了。或者,你也可以使用git config设置pager来达到同样的效果:为当前项目设置pager:$&git&config&core.pager&'less&-r'&&再将pager设置的作用域设置为整个项目:$&git&config&--global&core.pager&'less&-r'&&2.设置全局代理在某些网络环境下,你可能需要为git配置代理,这很简单,只需要一行命令就可以了:git&config&--global&https.proxy&https://user:password@address:port&3.clone某个特定分支在某些大型项目中,或者只是图方便,有时候你可能只希望clone某个分支,你可以这样做:mkdir&$BRANCH&cd&$BRANCH&git&init&git&remote&add&-t&$BRANCH&-f&origin&$REMOTE_REPO&git&checkout&$BRANCH&4.比较某个文件和远程分支上的区别很简单:git&diff&localbranch&remotebranch&filepath&5.列出版本库中所有已删除的文件也许你是想将其恢复,因此需要仔细确认某些merge操作,无论如何,列出版本库中所有已删除的文件会非常有帮助。你只需要这样做:git&log&--diff-filter=D&--summary&如果你想将其恢复,参照。如果你不想知道是哪次commit中删除的,只需要添加一个grep delete。git&log&--diff-filter=D&--summary&|&grep&delete&6.在版本库所有版本中搜寻一条字符串往往你想要查找某段代码、某个函数、一个常量、一个文件,但是却找不到了。它被删除了,什么时候删除的?这个小技巧能搜索整个版本库中git diff信息,可能会花些时间,但是非常有用:git&rev-list&--all&|&(&&&&&while&read&&do&&&&&&&&&git&grep&-F&'Your&search&string'&$revision&&&&&done&)&7.应用另外一个(不相关的)本地版本库中的patch从另一个版本库中cherry-pick一条提交记录,首先需要将那个版本库作为一个远程版本库添加进来,并fetch其变化,然后cherry-pick其提交记录。如果你追求速度,也可以使用这个未经优化的命令:git&--git-dir=../some_other_repo/.git&format-patch&-k&-1&--stdout&&SHA|&git&am&-3&-k&8.从新的主干中分出一个新分支有时候你会在better_brach上工作一段时间,并准备将其设为新的master,你会怎么做?这里是Stack Overflow上提供的常规解决方案:1.切换到better_brach分支:git&checkout&better_branch&2.保留better_branch分支全部内容,但是记录合并:git&merge&--strategy=ours&master&3.切回matergit&checkout&master&4.快速合并git&merge&better_branch&5.如果你想让合并步骤变得更清晰,可以添加commit信息。只需要修改下第二步:git&merge&--strategy=ours&--no-commit&master&git&commit&#&Here&add&your&custom&message&to&the&commit&template&9.向分支提交一个初始的空commit,保证完全复位这样会重写历史记录,所以只能在未和任何人分享前做,否则将可能把同事者的文件破坏。1.创建一个新的空分支,例如:newrootgit&checkout&--orphan&newroot&git&rm&--cached&-r&.&git&clean&-f&-d&2.创建空的commitgit&commit&--allow-empty&-m&'[empty]&initial&commit'&3.重新发送分支的全部内容git&rebase&--onto&newroot&--root&master&4.删除临时分支newrootgit&branch&-d&newroot&现在master就已经包含了一个空的root commit了。10.清空一个分支来做些不同的事有时候你会想要从某个分支重新开始,或者打算保留一些逻辑上和主干相关但是跟踪另一个跨职能方面的代码,就像GitHub项目的gh-pages。但如果你只想重新开始某个分支,清空所有历史记录呢?1.检出(checkout)一个分支:git&checkout&-b&branch_to_zero&2.跟上条一样,先建立增加一个初始的空commit,之后就可以通过重新设置来清空一个分支。3.使用hard重置分支到刚刚创建的初始commit:git&reset&--hard&initial_commit&11.如何修改一个特定的commit?当你想在推送前重做你最后的commit时,可以使用修改命令(git commit --amend)。如果你想修改的不是最后一个commit呢?这种情况下,你可以使用git rebase,例如,你想要修改bbc643cd commit,运行下面的命令:$git&rebase&bbc643cd^&--interactive&&在默认的编辑器中选择并修改你期望修改的,然后保存修改并输入:$&git&add&&&现在你就可以使用$git&commit&--amend&来修改commit,之后使用$&git&rebase&--continue&&返回之前最新的commit。12.如何隐藏多个已修改文件中一个?git stash --keep-index命令可以用来隐藏上次commit中没有add的东西,之后add想要提交的文件并运行相应命令就可以了。按照下面的提示,你可以把一条老的commit提交到多个变更集中:互动地rebase最后一条好的commit:git&rebase&-i&last_good_commit&将某些变化标记为edit:git&reset&HEAD^&git&add&file1&file2&file3&添加相应的文件:git&add&file1&file2&file3&因此之前没有添加的文件:git&stash&--keep-index&别忘了收尾:git&commit&git&stash&pop&有必要的话,重复第二步之后的步骤:git&rebase&--continue&原文链接:
快毕业了,没工作经验,
找份工作好难啊?
赶紧去人才芯片公司磨练吧!!

我要回帖

更多关于 git撤销commit 的文章

 

随机推荐