Git问题记录

Git问题记录

记录一下使用git过程中遇到的一些问题和心得。

1.git命令行删除本地/远程分支

删除本地分支:

git branch -d local_branch_name-d--delete别名)

或者强制删除(带有大写D,它是 --delete --force 的别名),不考虑其合并状态。

先查看远程分支:
git branch -r

删除远程分支
git push origin -d remote-branch-name

或者

git branch -r -d origin/branch-name
git push origin :branch-name

第一句是删除了本地的远程跟踪分支,此时使用git branch -a查看,分支remotes/origin/branch-name应该已经不存在了。
为什么还需要第二句,因为上面只是把本地的远程跟踪分支删除了,远程的分支还没有删除,所以第二句就是真正的删除远程分支。

2.删除远程分支的时候提示:git fatal: 远程 origin 已经存在。

不小心将git远程地址配错了,再次配置提示以下错误:
fatal: 远程 origin 已经存在。

此时只需要将远程配置删除,重新添加即可;

git remote rm origin
git remote add origin https://github.com/***/WebCrawlers.git

再次提交文件即可正常使用。

3.提示:[rejected] master -> master (fetch first)

当我使用此命令时, $ git push origin master它会显示一条错误消息。

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:zapnaa/abcappp.git'

1.如果要解决,请先获取pull(然后合并merge)。
2.如果要强制push,请使用该–force选项。

git pull origin master
或者
git fetch origin master
git merge origin master

当您尝试将非Git文件系统转换为Github存储库时,可能是一个例外。在那里,您必须强制执行第一次提交。

git init
git add README.md
git add .
git commit -m "first commit"
git remote add origin https://github.com/userName/repoName.git
git push --force origin master

3.其他方法
如错误消息中所述,您必须“先获取”再合并。使用命令:

git fetch origin master

然后按照以下步骤进行合并:

git pull origin master
git add .
git commit -m 'your commit message'
git push origin master

4.也有可能是远程仓库设置成保护模式了,需要更改下。

备注:如何上传到GitHub
参考:https://juejin.im/post/5c6b7241518825246b10351d

4.git checkout 命令

创建一个叫做“feature_x”的分支,并切换过去:

git checkout -b feature_x

切换回主分支:

git checkout master

再把新建的分支删掉:

git branch -d feature_x

查看当前所有的本地分支:

git branch

5.更新与合并

要更新你的本地仓库至最新改动,执行:

git pull

如果提示:当前分支没有跟踪信息。请指定您要合并哪一个分支。
在这里插入图片描述

则需要执行执行:

git pull <远程> <分支>

如果您想要为此分支创建跟踪信息,您可以执行(test_v0716为本地选定分支)
然后再执行从远程拉分支到本地即可:

git branch --set-upstream-to=origin/<分支> test_v0716
git pull

如果发现报下面的错误:您对下列文件的本地修改将被合并操作覆盖
在这里插入图片描述
可以执行下面的命令查看本地分支和远程分支之间的差异:

git status

在这里插入图片描述

6.下载代码

如果pull的时候本地代码和远程分支差别太大,可以直接删除本地代码,再从远程分支pull下来。
下载远程指定分支的代码:

git clone -b dev_branch <仓库地址>

7.回滚/撤销add

有时候我们使用git add .后且还没有执行git commit,想要撤销已经提交的add怎么办。
撤销暂存区全部文件修改:git reset HEAD
撤销暂存区某个文件修改:git reset HEAD <file>

8.回滚/撤销commit

有时候我们使用git add .git commit -m 'xxx'后且还没有执行git push,想要撤销已经提交的commit怎么办。
如果仅撤销最近一次commit,可以使用命令:git reset --soft HEAD^
这样就成功撤销了commit,如果想要连着add也撤销的话,--soft改为--hard(删除工作空间的改动代码)。
如果想回滚到某一个commit,需要找到commit_id,然后执行命令:git reset --soft commit_id

命令详解:
HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1
如果进行两次的commit,想要都撤回,可以使用HEAD~2
如果不确定每次commit提交的改动,可以使用git log查看具体commit记录信息。
在这里插入图片描述

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

另外,如果commit写错了要如何修改?
git commit --amend
这时候会进入vim编辑器,修改完成你要的注释后保存即可。

9.回滚远程代码

1、本地代码回滚到上一版本(或者指定版本)

git reset --hard HEAD~1

2、加入-f参数,强制提交,远程端将强制跟新到reset版本

git push origin branch_name -f

10.合并其他分支代码:git merge

背景:在工作中,我们经常需要merge同事分支的代码到自己分支上面测试,这个时候就需要用到git merge
假如同事的代码分支是A,我的代码分支是B
1.先切换到A分支:git checkout -b A,执行 git log 查看本地是否有远程分支A的commit,如果没有则需要拉一下A分支的代码:git pull origin A,此时本地就有了A分支的代码(如果有冲突,需要解决冲突)
2.再切换回到B分支,并把A分支的代码merge到B分支:git checkout Bgit merge A,此时A分支的代码就被merge到了B分支中
3.最后,再提交B分支代码到远程仓库,远程仓库B分支就有了A分支的代码。
4.测试完成后,如果想撤销A分支代码commit,直接执行git reset --hard HEAD^,在强制推送到远程分支即可。

11.合并其他分支代码:git rebase(建议)

背景:git rebasegit merge 功能类似,只不过使用 rebase 可以使我们保持一个线性且更加整洁的提交历史。
参考:https://waynerv.com/posts/git-rebase-intro/#rebase-%E5%92%8C-merge-%E7%9A%84%E5%8C%BA%E5%88%AB
操作步骤:
方式一(建议):
1.在开发分支上执行:git pull --rebase origin master
2.解决冲突
3.推送本地分支代码到远程分支:git push origin feature_branch -f 或者 git push --force origin feature_branch
方式二:
1.更新master分支:git pull origin master
2.切换到feature分支:git checkout feature_branch
3.执行git rebase:git rebase master
如果有冲突,需要解决冲突。
4.推送本地分支代码到远程分支:git push origin feature_branch -f 或者 git push --force origin feature_branch
其他命令:git rebase --continuegit rebase --abort

12.剔除某些commit:git rebase or git revert

1.使用git log 命令,查看已提交的记录。例如红色圈出的commit是本次要删除的commit。
在这里插入图片描述

2.先找到此次提交之前的一次提交的commit 1d6b81b138f89735265900b94fcd1ec39375e7b4

3.执行git rebase -i 1d6b81b138f89735265900b94fcd1ec39375e7b4,打开一个交互式的rebase编辑器,列出了从指定commit之后到当前commit的所有commit, 在rebase编辑器中,找到要被剔除的commit的行,将需要删除的commit的pick改为drop,保存并关闭编辑器。

git会重新应用commit,并创建一个新的commit历史。rebase完成后可以看到输出:Successfully rebased and updated refs/heads/your_branch,说明成功了。

4.再次执行git log命令,查看已提交记录,之前红色圈出的commit记录已被删除。

注意:使用git rebase进行commit剔除操作时需要格外小心,因为它会改变commit的历史。如果这些commit已经被推送到远程仓库,剔除后会导致其他开发者的问题。因此,在进行rebase操作之前,请确保只有你自己在使用这个分支。

无论是使用git revert还是git rebase,剔除commit后,都需要确保仓库的状态是正确的,并且运行git push命令将更改推送到远程仓库。

13.合并某些commit:git cherry-pick

背景:研发流程中,一般会有master和release分支,release分支一般会固定周期基于master checkout出来。
因为master分支是会不断有新代码合入,所以release分支一般会落后于master分支。
如果我们只需要把master分支的新合入的某一个commit合入到release分支,那么git cherry-pick就可以派上用场。
操作步骤(假设release分支只能通过merge request方式提交代码):
1.本地拉取release分支,基于release分支checkout出一个pick分支
2.找到master分支上需要pickcommitHash
3.执行git cherry-pick -m 1 <commitHash>
4.push代码到远程,新建merge request并合并代码到release分支即可
如果想要转移一系列的连续提交,可以使用下面的简便语法

git cherry-pick A..B 

上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。
注意,上面的命令,区间是左闭右开的,即提交 A 将不会包含在 cherry-pick 中。如果要包含提交 A,可以使用下面的语法。

git cherry-pick A^..B 

如果报错:fatal: bad revision 'A^..B',说明本地没有需要cherry-pick的代码,需要先fetch一下。

参考:https://www.cnblogs.com/zublogs/p/16091028.html

14.恢复一些现有的提交:git revert

方式一:如果没有冲突,可以直接在网页上操作,操作简单方便。
在这里插入图片描述
方式二:
1.本地拉取master分支,基于master分支checkout出一个revert分支
2.找到master分支上需要revertcommitHash
3.执行git revert -m 1 <commitHash>
4.push代码到远程,新建merge request并合并代码到master分支即可
其他命令:git revert --continuegit revert --abort

官方文档:https://git-scm.com/docs/git-revert

15.拉取远程分支

背景:我们在本地开发分支dev_1,需要切换到开发分支dev_2上进行开发。
步骤:拉取远端分支, 先fetch后checkout
1.从远端仓库下载指定分支到本地:git fetch origin <remote_branch_name>
2.创建并切换到新的本地分支,并和远端同名分支建立track关系:git checkout <remote_branch_name> (不重新命名)
切换到未创建过的新分支:git checkout -b <new_branch_name> (以上面为基点切新分支)

参考链接

git - 简明指南:https://www.runoob.com/manual/git-guide/

Git教程 - 廖雪峰的官方网站:https://www.liaoxuefeng.com/wiki/896043488029600

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值