[学习笔记] [git命令] Git常见问题及处理

如何撤销代码

正常的情形,修改工作区后一般的流程是:git statusà git add filenameà git commit -m 'message...'à git push,其中 . 表示所有的文件。如何撤销修改或者回退提交的代码呢?

对于新建项目,第一次操作失误通过如下方式回退:

  • git add 后撤销:git rm -r --cached .
  • git commit后撤销:git update-ref -d HEAD

下面主要讲解非第一次提交项目的撤销与回退。

(1)本地修改撤销(还没有add)。

  • git checkout filename :只需要撤销工作区的文件修改,即用暂存区的文件覆盖工作区中的文件。
  • git checkout -- . 或者git checkout .  :这条命令最危险,会撤销所有本地的修改(相对于暂存区),相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会。

(2)git add后 撤销。当修改的文件已经add到暂存区,需要撤销这次添加,即撤销上一次git add filenames 操作,可通过git reset撤销。

  • git reset -- filename 或者git reset HEAD filename  //相当于命令git add filename 的反操作。
  • git reset 或者 git reset HEAD  //撤销暂存区内所有的文件改动。

(3)git commit 后撤销。先使用git log 查看节点的commit id ,然后执行git reset commit_id 或者git reset –hard commit_id (注意:回退到上一个commit节点, 代码也发生了改变,变成上一次的;推荐使用前者,这样更改的代码会保留,后者直接就消失了,全部变成上一次commit后的代码了)。

(4)git push 后撤销。

  • git reset --hard <commit id>,然后重新提交: 这种方式有风险,将会抹掉中间commit的所有记录; 把修改推到远程服务器如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以我们要用“git push -f”强制推上去: git push -f -u origin master。
  • git revert <commit id>,然后重新提交:相当于本地恢复到之前的某次代码,然后把本地代码当作最新代码进行提交。指针继续向前,版本会递增,不影响之前提交的内容,提交过程都会保留下来。
  • 当需要彻底撤销最近的提交,HEAD指针、暂存区、工作区都回到上次的提交状态,自上一次以来的提交全部丢失: git reset --hard HEAD^

(5)本地有修改和提交,如果想放弃这些修改和提交,可以使用如下命令强制用远程的库更新:

git fetch --all //只是下载代码到本地,不进行合并操作;

git reset --hard origin/master //把HEAD指向master分支最新下载的版本

 

 

Pull报错:Please move or remove them before you can merge

在使用git pull时,经常会遇到报错: Please move or remove them before you can merge。这是因为本地有修改,与云端别人提交的修改冲突,又没有merge。如果确定使用云端的代码,最方便的解决方法是删除本地修改。

如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:

git reset --hard

git pull

或者

git reset HEAD

git clean -fd

git checkout -- .

git pull

我们在git add之后,但是还想放弃git add,回到上一次git commit的状态,怎么办? (就是说撤销掉暂存区,回到工作区的状态),分两步执行:

场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作git checkout -- file。

git reset HEAD file命令可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。(HEAD^表示上一个版本,就是git log的第二次)

Pull报错:You have not concluded your merge (MERGE_HEAD exists) git pull拉取失败

今天获取git线上仓库代码报了下面错误,错误可能是因为在你以前pull下来的代码没有自动合并导致的。

解决办法:

1)保留你本地的修改。

git merge --abort

git reset --merge

合并后记得一定要提交这个本地的合并,然后在获取线上仓库git pull

2)做好备份,放弃本地修改

如果你本地修改不大,或者自己有一份备份留存,可以直接用线上最新版本覆盖到本地。注意,这样操作,之前所做的修改会被覆盖!!!谨慎使用!

git fetch --all

git reset --hard origin/master

git fetch

Push报错:error: unpack failed: error Missing tree

error: unpack failed: error Missing tree 179cb322d514382f5b0efe6f725f9aa0616dacc9

fatal: Unpack error, check server log

To ssh://yourname@xxx

! [remote rejected] HEAD -> refs/for/maste (n/a (unpacker error))

解决办法:

$ git push --no-thin origin HEAD:refs/for/master

在push指令中,添加参数: --no-thin。

Push报错:! [remote rejected] master -> refs/for/master (no new changes)

问题分析:Git bash提示:no new changes表示没有新的提交。Gerrit根据commit id和changeId判断是否有新的提交,如果以上两者都是相同的,则Gerrit会拒绝提交。

解决办法:git commit --amend生成新changeId。

 

Git diff ^M的消除

这是由于换行符在不同的操作系统上定义的区别造成的。Windows用CR LF来定义换行,Linux用LF。CR全称是Carriage Return ,或者表示为\r, 意思是回车。LF全称是Line Feed,它才是真正意义上的换行表示符。如果用git diff的时候看到^M字符,就说明两个文件在换行符上有所差别。

下面简单的方法可以让git diff的时候忽略换行符的差异:

git config --global core.whitespace cr-at-eol

更好的方法是每个项目都有一个.gitattributes文件,里面配好了换行符的设置,参考https://help.github.com/articles/dealing-with-line-endings

 

远程删除分支后,本地git branch -a 依然能看到该分支

使用 git branch -a 命令可以查看所有本地分支和远程分支(git branch -r 可以只查看远程分支) ,发现很多在远程仓库已经删除的分支在本地依然可以看到。

使用命令 git remote show origin,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

此时我们可以看到那些远程仓库已经不存在的分支,根据提示,使用 git remote prune origin 命令,这样就删除了那些远程仓库不存在的分支。

发布了7 篇原创文章 · 获赞 7 · 访问量 5538

猜你喜欢

转载自blog.csdn.net/shmily_jing/article/details/100778366
今日推荐