[学习笔记][git命令]Git常见问题及处理
如何撤销代码
正常的情形,修改⼯作区后⼀般的流程是:git statusà git add filenameà git commit -m ''à git push,其中 . 表⽰所有的⽂件。如何撤销修改或者回退提交的代码呢?
对于新建项⽬,第⼀次操作失误通过如下⽅式回退:
git add 后撤销:git rm -r --cached .
git commit后撤销:git update-ref -d HEAD
下⾯主要讲解⾮第⼀次提交项⽬的撤销与回退。
(1)本地修改撤销(还没有add)。
git checkout filename :只需要撤销⼯作区的⽂件修改,即⽤暂存区的⽂件覆盖⼯作区中的⽂件。
git checkout -- . 或者git checkout .  :这条命令最危险,会撤销所有本地的修改(相对于暂存区),相当于⽤暂存区的所有⽂件直接覆盖本地⽂件,不给⽤户任何确认的机会。
git常用指令
(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⽂件,⾥⾯配好了换⾏符的设置,参考
远程删除分⽀后,本地git branch -a 依然能看到该分⽀
使⽤ git branch -a 命令可以查看所有本地分⽀和远程分⽀(git branch -r 可以只查看远程分⽀) ,发现很多在远程仓库已经删除的分⽀在本地依然可以看到。
使⽤命令 git remote show origin,可以查看remote地址,远程分⽀,还有本地分⽀与之相对应关系等信息。
此时我们可以看到那些远程仓库已经不存在的分⽀,根据提⽰,使⽤ git remote prune origin 命令,这样就删除了那些远程仓库不存在的分⽀。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。