Git学习(三):提交、撤销以及一些常见问题

 

目录

 前提概要​

git status  //查看我们工作区的修改的文件

git diff

提交

撤销/回退(!!)

1. 撤销对文件的修改

2. add多了,取消暂存

3. commit错了,重新commit

4. 取消commit, 回退到指定版本

5. git push修改撤销

git reset

git revert

git merge

一些问题

git branch -r无法显示最新分支问题

error: 您尚未结束您的合并(存在 MERGE_HEAD)。

git revert时显示是一个合并提交但未提交-m选项 fatal:还原失败

工作区中下列未跟踪的文件将会因为检出操作而被覆盖:

git clean 从工作区中删除未跟踪的文件


 前提概要https://img2018.cnblogs.com/blog/1249006/201906/1249006-20190629161859842-1533387643.png

由上图可以看出,通常情况下, 当我们运行的git add .,是将工作区(workspace)的代码提交到了暂存区(index)中,然后我们经常运行的git commit -m “修改代码提交说明”是将暂存区中的代码提交到了本地仓库(local Repository)中。再往后就是我们通过git push将本地仓库的代码提交到远程仓库了。

https://img2018.cnblogs.com/blog/1249006/201906/1249006-20190629172756021-1042075199.png

git status  //查看我们工作区的修改的文件

git diff

https://www.cnblogs.com/lsgxeva/p/8540485.html

git diff           //查看 workspace(工作区) 与 index(暂存区) 的差别的。

git diff –cached  //查看index(暂存区)与local repositorty(本地仓库)的差别的

git diff HEAD   //查看 workspace和local repository的差别的。(HEAD 指向的是 local repository 中最新提交的版本)

注:git diff 后跟两个参数,如果只写一个参数,表示默认跟 workspace中的代码作比较。git diff 显示的结果为 第二个参数所指的代码在第一个参数所指代码基础上的修改。如,git diff HEAD 表示 workspace 在 最新commit的基础上所做的修改

 

提交

先用git status和git diff查看一下

git add [参数] <路径>   // -u不包括新增文件,-a包括

git commit -m ‘message’   //-a将未git add也提交,不包括新增文件

git push <远程主机名> <本地分支名>:<远程分支名>

 

撤销/回退(!!)

git status //查看状态

1. 撤销对文件的修改

git checkout -- <file>...  //对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本(本地仓库)覆盖掉它。

git checkout 文件名     //从暂存区拉取到工作区,撤销本地修改

git restore 文件名      //同上

 

2. add多了,取消暂存

git reset HEAD <file>   //比如git reset HEAD CONTRIBUTING.md

 

3. commit错了,重新commit

git commit --amend

如果上次提交的内容有误,想进行修改,而且不想进行新的提交,使用该命令(最终只会有一个提交——第二次提交将代替第一次提交的结果)。步骤:

  1. 修正内容,执行“git add”;
  2. 执行“git commit --amend”;
  3. 自动进入vim提示需要添加commit信息。输入:“i”添加信息"delete fff",“esc”、“wq”退出并保存;
  4. 执行“git push -f”成功推送到服务器 (git push会提示报错:当前暂存区版本低于服务器版本一次提交)。

 

4. 取消commit, 回退到指定版本

git log  //查看之前版本

git reset <commit-id>

5. git push修改撤销

1)通过git reset是直接删除指定的commit

git log # 得到你需要回退一次提交的commit id

git reset --hard <commit_id>

git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除

 

2)通过git revert是用一次新的commit来回滚之前的commit

git log # 得到你需要回退一次提交的commit id

git revert <commit_id>  # 撤销指定的版本,撤销也会作为一次提交进行保存

 

3) git revert 和 git reset的区别

git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;

git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除

 

git reset

根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:

    git reset –mixed:默认选项。缓存区和你指定的提交同步,但工作目录不受影响。它回退到某个版本,只保留源码,回退commit和index信息

    git reset –soft:不删除工作空间的改动代码 ,撤销commit,不撤销git add file

    git reset –hard:删除工作空间改动代码,撤销commit且撤销add。不要随便使用!

    HEAD 最近一个提交

    HEAD^ 上一次

<commit_id>  每次commit的SHA1值. 可以用git log 看到,也可以在页面上commit标签页里找到

 

git reset --soft HEAD^ //拉取服务器最近一次提交到暂存区,该操作不影响工作区。

然后执行“git checkout 文件名”,从暂存区拉取到工作区。

注:如未进行push操作,可以直接执行“git checkout 文件名”,拉取暂存区替换工作区

适用场景:如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用reset

git revert

git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。如下图所示:

适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。

 

使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:

(1)反做,使用“git revert -n 版本号”命令。如下,反做版本号为8b89621的版本:

git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861

注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名

(2)提交,使用“git commit -m 解释”,如:

git commit -m "revert add text.txt"

https://blog.csdn.net/yxlshk/article/details/79944535

 

注意,revert merge操作需要提供-m选项

  git revert< hash> -m 1或者2

-m参数含义:Merge 标注为Merge: a2471f3 6a17d85,传1表示撤销到a2471f3所代表的commit,传2表示撤销到6a17d85所代表的commit。数字1,2表示的是标注冒号后的位置编号。1代表合并前的分支,2代表

 

//git log可查看具体要回退哪个commit

//git log可查看具体要回退哪个commit
commit 94ce4b8dcb898f730e6eecd73c00491f8020b67e 
Merge: a2471f3 6a17d85 本次属于merge commit,注意Merge 标注 
Author: 罗** <luo**@youku.com> 
Date: Fri May 20 11:03:53 2016 +0800

commit a2471f331c36a21d25aa158668cdc05987eef114
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 11:03:01 2016 +0800

    verison 9

commit 6a17d85b04e52eddeb2ecb2a311804e10dada1e6
Author: 罗** <luo**@youku.com>
Date:   Fri May 20 11:02:10 2016 +0800

version 8

 

git merge

  1. 开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支

git checkout dev

git pull

git checkout master

git merge dev

git push -u origin master

二、当master代码改动了,需要更新开发分支(dev)上的代码

git checkout master

git pull

git checkout dev

git merge master

git push -u origin dev

 

 

一些问题

git branch -r无法显示最新分支问题

git fetch一下,拉取最新分支

 

error: 您尚未结束您的合并(存在 MERGE_HEAD)。

提示:请在合并前先提交您的修改。

fatal: 因为存在未完成的合并而退出。

git reset

 

git revert时显示是一个合并提交但未提交-m选项 fatal:还原失败

  git revert< hash> -m 1或者2

 

工作区中下列未跟踪的文件将会因为检出操作而被覆盖:

如果要清除未跟踪文件,可用git clean

如果要加入,用git add

 

git clean 从工作区中删除未跟踪的文件

使用 man 命令,查看命令使用

man git clean

SYNOPSIS 概要

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>...

OPTIONS

  • -d 删除未跟踪的目录和未跟踪的文件。如果一个未跟踪的目录是另一个不同的 Git 库,默认将不会把它删除。如果你想删除这个目录,可以使用 -f
  • -f , --force 如果 Git 配置中 clean.requireForce 没有设置为 false,git clean 将拒绝执行。除非是使用 -f -n -i
  • -i , --interactive 使用交互式显示将被删除的文件
  • -n , --dry-run 仅仅显示将被删除的文件,不会真正的删除
  • -q , --quiet 静默,仅仅显示错误,不包括成功移除的文件
  • -e <pattern> , --exclude=<pattern> 除了在 .gitignore(每个目录)和 $GIT_DIR/info/exclude,也要考虑这些模式设置的忽略规则
  • -x 不使用 .gitignore(每个目录)和 $GIT_DIR/info/exclude 的标准忽略规则,但仍然使用使用 -e 选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。 这可以使用(可能与 git reset)以创建一个原始的工作目录来测试一个干净的构建
  • -X 只删除 Git 忽略的文件。这可能有助于从头重建一切,但保留手动创建的文件

常用操作

通过以上几根参数组合,基本上可以满足删除未跟踪文件的需求了
1、例如在删除前先查看有哪些文件将被删除运行:

git clean -n

2、想删除当前工作目录下的未跟踪文件,但不删除文件夹运行(如果 clean.requireForce false 可以不加 -f 选项):

git clean -f

3、想删除当前工作目录下的未跟踪文件以及文件夹运行:

git clean -df

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值