Git修改提交历史

Git修改提交历史,第1张

Git的一个优势在于,当你在和别人共享你的工作之前,可以随便修改你的提交历史,当然不管在什么时候,最好不要改动已经推送到central server的commit,否则会产生一次变更的两个版本

在推送到central server之前,你可以选取staging area(暂存区)中的任意文件进行提交,也可以通过stash命令决定不与某些内容工作,也可以偷梁换柱地重写已经发生的commits,这包括:改变commit信息,拆分commit,压缩多条commit,改变提交的顺序,甚至移除某些不再需要的commit等。

为了对于上面的描述有宏观的了解,笔者在本地新建了一个仓库且提交了三个commit,it seems like this:

其中SecondCommit中包含两个txt文件,其余两个commit都只包含一个txt文件。

接下来就来篡改一下历史吧!

(注:--pretty=format 表示格式化输出,%h 表示提交对象的简短哈希字串,%s 表示提交说明,为了方便后面的展示,笔者用alias命令简化上面的命令: git config --global alias.last "log --pretty=format:"%h,%s"",之后如果需要查看log信息,git last 或者 git last -n 即可)

修改最后一条commit是所有修改提交历史 *** 作中最常见的一个。它的命令很简单: git commit --amend

从英文单词amend的字面意思(修改,改正)就可以理解此命令。

执行此命令会进入一个编辑框:

了解vim的同学可能对这不会感觉到陌生,这里简单介绍一下,首先在键盘输入i(i 表示insert插入,由此进入编辑模式),更改title信息,按Esc退出编辑模式,最后输入 :wq (保存并且退出),收工。

如果对索引区的内容作了修改,先执行git add 命令,再执行git commit --amend , 效果是一样的,更改后的log信息如下:

Git提供了交互式变基工具,可以在任何想要修改的commit后停止,做任何想做的事。

通过git rebase -i 命令来交互式的运行变基(注:-i 是--interactive的缩写)。同时需要指定想要重写多久远的历史,比如修改最近三次提交:git rebase -i HEAD~3 ,因为笔者的FirstCommit是repository里面的第一个提交,所以笔者采用的是git rebase -i --root命令,有兴趣的同学可以看看这个: http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git/2309391#2309391.

执行git rebase -i --root命令,d出如下编辑框:

需要注意的是commit显示顺序刚好和git log的显示顺序相反。尤其注意Commands,之后所有的 *** 作都是基于这些命令, 这里笔者依次解释一下:

p , pick = use commit: 直接使用commit 不做任何修改,其中p 是pick的缩写,以下雷同;

r , reword = use commit, but edit the commit message: 使用commit,但是会更改commit 信息;

e , edit = use commit, but stop for amending :使用commit,但是遇到此命令时会停止合并;

s , squash = use commit, but meld into previous commit: 使用commit,但是会合并到前一个commit中;

f , fixup = like "squash", but discard this commit's log message:和squash类似,但是会抛弃commit的log信息

x , exec = run command (the rest of the line) using shell:使用shell运行命令

d , drop = remove commit:丢弃commit

整个其实就是一个脚本,每一行就相当于一个命令,位置可以互换,命令是从上往下执行的。如果移除某一行,对应的commit就丢失了,但是如果把所有的行都移除的话,整个rebase就被终止了。

了解了上面的命令,修改多条commit就显得很简单了。

由于篇幅的限制,这里笔者就改变第一条commit的提交信息:

之后便会执行rebase过程,然后d出一个编辑框,修改commit信息即可。

现在的log信息如下:

上面我们提到SecondCommit中包含两个文件,现在笔者将其拆分成两个commit,这个时候需要用到edit命令。

同样的先进入交互式变基: git rebase -i --root

当从上往下执行rebase的时候,遇到edit命令将会暂停rebase。

此时我们要做的就是reset  SecondCommit的提交 git reset HEAD~

这时候用git status 查看最新的状态:

交互式变基正在执行,SecondCommit的提交已经从索引区变成untrcked的状态了。我们需要做的就是将这两个文件分别add到暂存区然后commit到索引区。

$ git add  newfile1.txt

$ git commit -m "SecondCommitSplit-1

$ git add  newfile2.txt

$git commit -m "SecondCommitSplit-2

完成上面的 *** 作后还是处于rebase的状态,让rebase继续执行即可

git rebase --continue

现在log信息如下:

上面我们说过squash和fixup命令具有合并commit的功能,笔者习惯用的是fixup命令,只保存一个message信息。

比如我们现在要合并最近的两个commit:

中间还给SecondCommitSplit-2更改了commit 信息

合并后的log信息如下:

上面讲过,更改行的位置即可改变commit的提交顺序,比如说把第一条和第三条commit的顺序互换:

修改顺序后的log信息如下:

当然,如果commit之间有相互依赖关系的话就没有这么简单了。

其实整篇文章都是围绕pick,reword,edit,squash,fixup等几个常用的命令进行的简单实践,实际开发过程中的情况还要复杂,具体问题还是要具体分析,笔者只是抛砖引玉,如果有不妥当的地方,还请各位看官指点一二。

1. git gui怎么查看文件修改记录

在git中查看历史的命令主要是git log,要查看某个文件的修改历史可以这样:$ git log -- begin.txt可以添加不同的选项让输出的内容或格式有所不同。

$ git log -p -- begin.txt-p 选项可以输出每次提交中的diff, 但个人感觉会把输出搞得很长、很乱,不容易找到重点。个人比较喜欢的方式是:$ git log --pretty=oneline -- filename在log 命令中加入 --pretty=oneline 选项会让结果看起来清爽一些,但是只能看到ments,看不到提交的用户和日期。

2. git gui怎么查看文件修改记录

在git中查看历史的命令主要是git log,要查看某个文件的修改历史可以这样:

$ git log -- begin.txt

可以添加不同的选项让输出的内容或格式有所不同。

$ git log -p -- begin.txt

-p 选项可以输出每次提交中的diff, 但个人感觉会把输出搞得很长、很乱,不容易找到重点。

个人比较喜欢的方式是:

$ git log --pretty=oneline -- filename

在log 命令中加入 --pretty=oneline 选项会让结果看起来清爽一些,但是只能看到ments,看不到提交的用户和日期。

3. git 获取历史版本的几种方式

我们简单的描述一个例子:a)初始化 *** 作有两个文件file1.txt和file2.txt1, 初始化的时候就有这两个文件 *** 作:git initgit statusgit add .git mit -m “init version”2, 在master分支上修改了file1.txt,并提交 *** 作:(修改file1.txt)git add file1.txtgit mit -m “change file1”3, 然后新建分支banana,并切换到banana分支上 *** 作:git branch bananagit checkout banana4, 修改file1.txt和file2.txt,并提交。

*** 作:(修改file1.txt和file2.txt)git add file1.txt file2.txtgit mit -m “change by banana”这个时候,我们可以输入 gitk,查看一下当前的版本情况。如下图:git-0015, 然后,切换到master分支上,修改file2.txt,并提交。

*** 作:git checkout master(修改file2.txt)git add file2.txtgit mit -m “change by master”输入gitk,查看当前版本情况,如下图:git-002b)发现问题需要查看历史版本我们现在发现当前的版本有点问题,还不能提交到版本库。1,我们需要从git mit中返回.则输入:git reset --soft HEAD^解释一下,HEAD是当前分支的最新版本。

^表示父节点。当前节点的父节点,就是上一次提交的版本。

也就是标记为“change file1”的版本。问为什么不是”change by banana”这个版本呢?不同的分支哦。”

change by banana”是banana分支的最新代码,和master分支不同的。这个时候输入git status看看,是不是显示file2.txt修改了没有提交呢。

2,我们需要从git add中返回再仔细查看之后,我们发现file2.txt真的写错了,需要返回到git add之前的状态。输入:git reset -q file2.txt这个时候,file2.txt就回到了解放前了。

用git status查看一下,file2.txt是”change not staged for mit”状态。3,回到没有做过的情况我们最终确定,最后一次修改的file2.txt是无用的代码,我们需要废弃掉。

注意,这个 *** 作不能恢复的哦。git reset --hard这个命令,不能指定具体的文件。

是把当前的修改全部清除,恢复到最后一次提交的版本。这个时候,用gitk查看一下:git-003已经彻底回复到了“change file 1”的版本了。

4,直接回复到某个版本我们现在切换到banana分支。git checkout banana然后用gitk看一下。

可以看出,我们之前的 *** 作,对banana分支一点影响也没有。现在我们需要把banana分支回复到初始状态,但是当前的改动的代码还是需要留着。

我们可以看,init版本是当前版本的父节点的父节点。我们可以这么 *** 作:git reset --soft HEAD^^然后用gitk看一下:git-004最近的版本已经变成了init version了。

所有的改动都是add未提交状态。5,得到当前最新代码最后。

我们把file1.txt和file2.txt都删掉。我们需要从版本库中取得当前最新的代码。

很简单:git checkout master如果是要banana分支的最新代码,则:git checkout banana以上的 *** 作,我们知道了如何查看版本分支,和如何回复到以前的版本。

4. git gui怎么在本地建版本库

git怎么创建本地版本仓库安装git我就不用说了吧!下载地址:/msysgit/msysgit/releases/download/Git-1.9.4-preview20140815/Git-1.9.4-preview20140815.exe 安装完后 点击桌面Git Bash :命令如下$ mkdir testcms$ cd testcms$ pwd/Users/my-pc/testcmspwd命令用于显示当前目录。

在我的机器上,这个仓库位于\Users\my-pc\test\testcms。 如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

第二步,通过git init命令把这个目录变成Git可以管理的仓库:$ git initInitialized empty Git repository in /Users/my-pc/testcms/.git/瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的开发者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。

不过,不建议你使用自己正在开发的公司项目来学习Git,否则造成的一切后果概不负责。把文件添加到版本库首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。

版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

使用Windows的童鞋要特别注意:千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。

建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:set-utf8-notepad++言归正传,现在我们编写一个test.txt文件,内容如下:Git is a version control system.Git is free software.一定要放到testcms目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。和把大象放到冰箱需要3步相比,把一个文件放到Git仓库只需要两步。

第一步,用命令git add告诉Git,把文件添加到仓库:$ git add test.txt执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。第二步,用命令git mit告诉Git,把文件提交到仓库:$ git mit -m "wrote a test file"[master (root-mit) cb926e7] wrote a test file 1 file changed, 2 insertions(+) create mode 100644 test.txt简单解释一下git mit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

嫌麻烦不想输入-m "xxx"行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。

git mit命令执行成功后会告诉你,1个文件被改动(我们新添加的test.txt文件),插入了两行内容(test.txt有两行内容)。为什么Git添加文件需要add,mit一共两步呢?因为mit可以一次提交很多文件,所以你可以多次add不同的文件,比如:$ git add test1.txt$ git add test2.txt$ git add test3.txt$ git mit -m "add 3 files."现在总结创建git仓库分为三步:第一步 初始化一个Git仓库,使用git init命令。

添加文件到Git仓库:•第二步,使用命令git add ,注意,可反复多次使用,添加多个文件;•第三步,使用命令git mit,完成。这种用命令的方式感觉还是用svn好用,但是对于分布式版本控制来说git是最好的选择。

5. windows下git怎么查看提交历史

1.查看Git日志:

命令:git log 默认不加参数,git日志会按照最新的日期从上往下显示 参数:-p 显示版本间的代码差异

-数字 显示部分的提交

-哈希值 显示指定的版本

2.指定查找范围:

--since="5 hours" 显示最近5小时内的提交 --since="5 hours" -1 显示5小时内的最后一个提交 --before 用法和--since的用法差不多,显示的是在某个时间点之前的提交 版本1..版本2 说明:版本1之后到版本2的所有提交,版本2可以用 HEAD(要注意大写)表示当前的最新版本 版本^ 回溯一个版本 注意: 在windows下要加双引号"版本^" ~N: 回溯N个版本

3.查看指定版本之间的差异

git diff 版本号 说明:当前目录树和对应版本号的差异 git diff --stat 说明:统计对应改动的代码量

4.撤销修改

4.1增补修改(只能用于针对最后一个提交)

git mit -C HEAD -a --amend

4.2反转提交

创建一个新的反向的提交来抵消原来的提交

git revert -n HEAD 反转当前版本库最新的提交并且缓存起来。但是不提交

4.3复位

git reset --soft 缓存因复位带来的差异但是不提交,也就是复位到上一个提交前的状态 git reset --hard 同时删除提交 例子:git reset --hard HEAD^ 复位到HEAD之前的那个版本

5重新改写历史记录

什么时候需要改写历史记录?

给历史记录重新排序

多个提交合并成一个提交

一个提交分解成多个提交

git rebase -i HEAD~3

本质上利用的是变基 *** 作,定位到你想变化的范围之前。然后进入编辑器去修改你想修改的部分。完成之后再回到当前的末梢。

6. 怎样使用webstorm查看一个文件在git中的变动

首先,我们打开webstorm软件,然后找到项目里面的同时也在版本库中存在的文件。

打开文件后,我们点击编辑器上方菜单中"VCS"选项,在d出的菜单列表中选择“GIT”

点击后又会有一个级联菜单出现,里面的选项基本上就是git的一些常见 *** 作,我们选择“show history”选项,来查看文件的历史版本及相应改动。

我们可以看到软件下方有一个d出的界面有在这个文件名字下面有一个表格,表格的标题依次对应的是“版本号”、“日期”、“作者”、“mit信息”

然后我们随便点击一个版本所在行,就会d出一个两个版本的文件的比较界面,左边是上一个版本,右边是最新版本

两个版本相比较,以行的变动作为变动,我们可以看到绿色背静的代码是新添加的,蓝色背景的是有改动的部分。

7. windows下git怎么查看提交历史

给历史记录重新排序多个提交合并成一个提交一个提交分解成多个提交git rebase -i HEAD~3本质上利用的是变基 *** 作,定位到你想变化的范围之前.指定查找范围:--since="5 hours"。

然后进入编辑器去修改你想修改的部分:版本1之后到版本2的所有提交,版本2可以用 HEAD(要注意大写)表示当前的最新版本 版本^ 回溯一个版本 注意: 在windows下要加双引号":git log 默认不加参数,git日志会按照最新的日期从上往下显示 参数; -1 显示5小时内的最后一个提交 --before 用法和--since的用法差不多:-p 显示版本间的代码差异-数字 显示部分的提交-哈希值 显示指定的版本2..版本2 说明;版本^" ~N: 回溯N个版本3; 显示最近5小时内的提交 --since="5 hours".3复位git reset --soft 缓存因复位带来的差异但是不提交,也就是复位到上一个提交前的状态 git reset --hard 同时删除提交 例子:git reset --hard HEAD^ 复位到HEAD之前的那个版本5重新改写历史记录什么时候需要改写历史记录,显示的是在某个时间点之前的提交 版本1.查看指定版本之间的差异git diff 版本号 说明:当前目录树和对应版本号的差异 git diff --stat 说明:统计对应改动的代码量4.撤销修改4.1增补修改(只能用于针对最后一个提交)git mit -C HEAD -a --amend4.2反转提交创建一个新的反向的提交来抵消原来的提交git revert -n HEAD 反转当前版本库最新的提交并且缓存起来。但是不提交41.查看Git日志:命令。

8. 如何使用git gui提交代码

在windows系统客户端安装git工具。

注:如何安装git工具在此不做介绍,如需了解可网上搜索安装介绍。

在“本地文件”中添加“.git文件”,用于git管理。

进入本地文件夹,右击鼠标-单击Git Init Here-生成.git文件夹。

在github创建仓库用于存储管理本地文件,示例:Blog。

点击账号前的加号(Create New)--New repository,根据引导创建一个Blog仓库。

远程添加github上的Blog仓库。

1)进入本地文件夹下-右击鼠标-Git Gui-远端(remote)-Add。

2)获取github中Blog仓库的地址。

3) 在Add Remote窗口中填写名字、Location。

名字:Blog

Location:粘贴刚刚复制的Blog仓库路径

最后单击“Add”。

将本地文件内容即“已缓存的改动”,提交git管理的master分支上。

将本地文件上传到github上去。

单击Git Gui界面“上传”--“上传”窗口随意勾选一个或多个传输选项--点击“上传”--上传Blog过程中需要输入github的登录账号和密码。

在github上查看本地文件Blog项目是否上传成功。

END

注意事项


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/6056653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存