git commit/ git rebase /git pull/git reflog
2017-04-07 16:58
399 查看
当你不小心,写错了提交的注视/信息,该如何处理呢。理论上,SCM是不应该修改历史的信息的,提交的注释也是。
不过在Git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息.但是如果你已经push过了,那么其历史最后一次,永远也不能修改了。
我使用git commit --amend已经push过的,截图如下,我那个"fixes #3"永远的在版本历史中了。
git commit --amend
的用法,,,
# git commit --amend
然后在出来的编辑界面,直接编辑 注释的信息。。
==========================================================================================
==========================================================================================
git修改历史提交
2011-06-16 17:58
git使用amend选项提供了最后一次commit的反悔。但是对于历史提交呢,就必须使用rebase了。
git rebase -i HEAD~3
表示要修改当前版本的倒数第三次状态。
这个命令出来之后,会出来三行东东:
pick:*******
pick:*******
pick:*******
如果你要修改哪个,就把那行的pick改成edit,然后退出。
这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:
git commit --amend
来对commit进行修改。
修改完了之后,要回来对不对?
使用git rebase --continue
OK,一切都搞定了。
==============================================================
如果发现上一次提交的内容存在问题,就需要修改了
Gerrit中的一个Change就是一个Review任务,它对应一个commit。
每个commit,应该是为了一个目的的完整修改。如果某一次修改不完全,就需要修正该commit。
每一次修正之前的commit,重新提交时,都应该保持Change-Id不变,这样就不会产生新的Change,而是在原有的Change下产生一个新的Patch Set。
所有的Patch Set中,只有最新的一个是真正有用的,能够合并的。
#修改需要修改的地方。
git add .
git commit –amend
注:这种方式可以比较方便的保持原有的Change-Id,推荐使用。
这是可以完全控制上一次提交内容的方法。但在与Gerrit配合使用时,需特别注意保持同一个commit的多次提交的Change-Id是不变的。
否则,就需要Abondon之前的Change,产生一些垃圾不说,操作得不对,会使得简单的事情复杂化,甚至无法合并。
git reset HEAD^
#重新修改
git add .
git commit -m “MSG”
特别注意:为了保持提交到Gerrit的Change不变,需要复制对应的Change-Id到commit msg的最后,可以到Gerrit上对应的Change去复制,参见图1。
如果email不对,会无法提交到Gerrit,所以这个命令也可能用到。
git commit –amend –author=<user-email>
注:如果该email地址从未有过成功的提交,这个修改会不成功。在别的分支做一次成功提交之后,就可以修改了。
=========================================================
1. // 查看修改
git rebase -i master~1 //最后一次
git rebase -i master~5 //最后五次
2. // 显示结果如下,修改 pick 为 edit ,并 :wq 保存退出
pick 92b495b 2009-08-08: ×××××××
# Rebase 9ef2b1f..92b495b onto 9ef2b1f
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending //改上面的 pick 为 edit
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
3. 命令行显示:
Rebasing (1/1)
You can amend the commit now, with
git commit --amend
4. 使用 git commit --amend 进行修改,完成后 :wq 退出
5. 使用 git rebase --continue 完成操作
----------------------------------------------------------------------------------------------------------------------------------
git
status命令可以列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git
commit)的文件.
git
add命令主要用于把我们要提交的文件的信息添加到索引库中。当我们使用git commit时,git将依据索引库中的内容来进行文件的提交。
git add <path>表示
add to index only files created or modified and not those deleted
注意:git
add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录。
git不仅能判断出<path>中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库中。
git add -u
git add -u 表示
add to index only files modified or deleted and not those created
git add -u [<path>]:
把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。
省略<path>表示.,即当前目录。
git add -A
git add -A: [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。
省略<path>表示.,即当前目录。
git add -i
我们可以通过git
add -i [<path>]命令查看<path>中被所有修改过或已删除文件但没有提交的文件,
并通过其revert子命令可以查看<path>中所有untracted的文件,同时进入一个子命令系统。
git
reset……
如果发现错误的将不想staging的文件add进入index之后,想回退取消,则可以使用命令:git
reset HEAD <file>...
git
stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
------------------------------------------------------------------------------------------------------------------------------
git
pull --rebase
1.出现情况的背景:
当你提交的代码后,管理员发现,您的代码不能提交到服务器上,主要原因在于,你的commit 中和服务器中的有些commit不再同一时间轴上,即:你的有些commit要插入到服务器中的某些commit之间,这样就会造成代码的冲突。所以这个时候就要使用Git rebase。
假如,你平时使用的分支叫 new ,然后在这个分支上你刚提交过几个commit。
做法:
1.新建一个分支,并且代码和服务器中代码同步
git checkout origin/v2.0 -b temp
2.为了保证新建的temp分支代码是最新的,可以多执行下面一步
git pull
3.当你新建分支后,系统会自动checkout到temp分支上,此时
git checkout new
4.合并代码,并整理
git rebase temp //会将temp分支的代码合并过来,并按照提交的顺序排序
5. 因为顺序是重新整理的,所以肯定会出现冲突
6.解决冲突,最后 git add * ,但不许要git commit
7.解决后,执行 git rebase --continue
8.重新提交代码: git push for-*
注意:如果要对某些代码的commit重新整理
1. 可以记住某个commit号
2. git rebase -i commit号
3. 会显示一个整理提交的界面,有很多参数,e。p。等等
4.将前面的参数改为e。则wq保存后,系统会自动让你重新修改commit内容
5.修改完成后,再git push for-*
------------------------------------------------------------------------------------------------------------------------------------------------------
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。
Git也允许手动建立追踪关系。
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
$
git pull上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用–rebase选项。
不过在Git中,其commit提供了一个--amend参数,可以修改最后一次提交的信息.但是如果你已经push过了,那么其历史最后一次,永远也不能修改了。
我使用git commit --amend已经push过的,截图如下,我那个"fixes #3"永远的在版本历史中了。
git commit --amend
的用法,,,
# git commit --amend
然后在出来的编辑界面,直接编辑 注释的信息。。
==========================================================================================
==========================================================================================
git修改历史提交
2011-06-16 17:58
git使用amend选项提供了最后一次commit的反悔。但是对于历史提交呢,就必须使用rebase了。
git rebase -i HEAD~3
表示要修改当前版本的倒数第三次状态。
这个命令出来之后,会出来三行东东:
pick:*******
pick:*******
pick:*******
如果你要修改哪个,就把那行的pick改成edit,然后退出。
这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:
git commit --amend
来对commit进行修改。
修改完了之后,要回来对不对?
使用git rebase --continue
OK,一切都搞定了。
==============================================================
Git修改前一次提交的方法(特别注意保持Change-Id不变)
如果发现上一次提交的内容存在问题,就需要修改了
Change:
Gerrit中的一个Change就是一个Review任务,它对应一个commit。每个commit,应该是为了一个目的的完整修改。如果某一次修改不完全,就需要修正该commit。
每一次修正之前的commit,重新提交时,都应该保持Change-Id不变,这样就不会产生新的Change,而是在原有的Change下产生一个新的Patch Set。
所有的Patch Set中,只有最新的一个是真正有用的,能够合并的。
修改前一次提交的方法
方法一:用–amend选项
#修改需要修改的地方。git add .
git commit –amend
注:这种方式可以比较方便的保持原有的Change-Id,推荐使用。
方法二:先reset,再修改
这是可以完全控制上一次提交内容的方法。但在与Gerrit配合使用时,需特别注意保持同一个commit的多次提交的Change-Id是不变的。否则,就需要Abondon之前的Change,产生一些垃圾不说,操作得不对,会使得简单的事情复杂化,甚至无法合并。
git reset HEAD^
#重新修改
git add .
git commit -m “MSG”
特别注意:为了保持提交到Gerrit的Change不变,需要复制对应的Change-Id到commit msg的最后,可以到Gerrit上对应的Change去复制,参见图1。
方法三:只是修改作者
如果email不对,会无法提交到Gerrit,所以这个命令也可能用到。git commit –amend –author=<user-email>
注:如果该email地址从未有过成功的提交,这个修改会不成功。在别的分支做一次成功提交之后,就可以修改了。
=========================================================
1. // 查看修改
git rebase -i master~1 //最后一次
git rebase -i master~5 //最后五次
2. // 显示结果如下,修改 pick 为 edit ,并 :wq 保存退出
pick 92b495b 2009-08-08: ×××××××
# Rebase 9ef2b1f..92b495b onto 9ef2b1f
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending //改上面的 pick 为 edit
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
3. 命令行显示:
Rebasing (1/1)
You can amend the commit now, with
git commit --amend
4. 使用 git commit --amend 进行修改,完成后 :wq 退出
5. 使用 git rebase --continue 完成操作
----------------------------------------------------------------------------------------------------------------------------------
git
status命令可以列出当前目录所有还没有被git管理的文件和被git管理且被修改但还未提交(git
commit)的文件.
git
add命令主要用于把我们要提交的文件的信息添加到索引库中。当我们使用git commit时,git将依据索引库中的内容来进行文件的提交。
git add <path>表示
add to index only files created or modified and not those deleted
注意:git
add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录。
git不仅能判断出<path>中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库中。
git add -u
git add -u 表示
add to index only files modified or deleted and not those created
git add -u [<path>]:
把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。
省略<path>表示.,即当前目录。
git add -A
git add -A: [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。
省略<path>表示.,即当前目录。
git add -i
我们可以通过git
add -i [<path>]命令查看<path>中被所有修改过或已删除文件但没有提交的文件,
并通过其revert子命令可以查看<path>中所有untracted的文件,同时进入一个子命令系统。
git
reset……
如果发现错误的将不想staging的文件add进入index之后,想回退取消,则可以使用命令:git
reset HEAD <file>...
git
stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
------------------------------------------------------------------------------------------------------------------------------
git
pull --rebase
1.出现情况的背景:
当你提交的代码后,管理员发现,您的代码不能提交到服务器上,主要原因在于,你的commit 中和服务器中的有些commit不再同一时间轴上,即:你的有些commit要插入到服务器中的某些commit之间,这样就会造成代码的冲突。所以这个时候就要使用Git rebase。
假如,你平时使用的分支叫 new ,然后在这个分支上你刚提交过几个commit。
做法:
1.新建一个分支,并且代码和服务器中代码同步
git checkout origin/v2.0 -b temp
2.为了保证新建的temp分支代码是最新的,可以多执行下面一步
git pull
3.当你新建分支后,系统会自动checkout到temp分支上,此时
git checkout new
4.合并代码,并整理
git rebase temp //会将temp分支的代码合并过来,并按照提交的顺序排序
5. 因为顺序是重新整理的,所以肯定会出现冲突
6.解决冲突,最后 git add * ,但不许要git commit
7.解决后,执行 git rebase --continue
8.重新提交代码: git push for-*
注意:如果要对某些代码的commit重新整理
1. 可以记住某个commit号
2. git rebase -i commit号
3. 会显示一个整理提交的界面,有很多参数,e。p。等等
4.将前面的参数改为e。则wq保存后,系统会自动让你重新修改commit内容
5.修改完成后,再git push for-*
------------------------------------------------------------------------------------------------------------------------------------------------------
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
$ git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
$ git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
$ git fetch origin $ git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
$ git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
$
git pull上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用–rebase选项。
$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
-----------------------------------------------------------------------------------------------
git reflog 可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
相关文章推荐
- git的操作(拉代码到本地/commit到本地/pull/push到远程/新建分支/合并分支/)
- git pull和git pull -- rebase
- 解决本地上传远程的冲突两种方式的区别:git push -f origin master和git pull --rebase origin master
- git reflog 恢复删除的commit
- git合并多个commit的方法: git rebase -i
- git rebase后commit丢失
- git 上传项目 报错 git pull --rebase origin master
- git reflog 可以恢复删删掉的commit,比如用reset HEAD^1回退删掉的commit
- 给git pull默认加上rebase功能
- git pull,git clone,git fetch,git rebase
- Git的push、commit以及pull
- git rebase后丢失本地commit记录
- Git使用rebase合并多个commit
- 第二章-第二题(练习使用git的add/commit/push/pull/fetch/clone等基本命令)--龙秋娴
- git pull rebase笔记
- git常见问题之git pull时Automatic merge failed; fix conflicts and then commit the result.
- 简单对比git pull和git pull --rebase的使用-(转)
- git commit/git commit --amend/git commmit rebase, reset
- 【Git】先commit后pull由于版本冲突,提交内容看不到的解决方法
- 对比git pull和git pull --rebase