前言
文章记录自己对 Git 操作的理解,和一些在使用过程中遇到的问题和解决方法,不定时更新
Git 常用命令
查看分支
git branch
创建分支
git checkout -b newbranch
切换分支
git checkout newbranch
添加到暂存区
git add <file>
git add .这两个一个是添加单个文件,一个是添加所有改动的文件,如果改动的文件多,可以先使用第二个命令添加所有文件,然后再 使用
git restore <file>
将不需要提交修改的文件移出来。提交代码
git commit -m "feat: xxx"
新功能可以用feat,对原来代码的修改可以用 fix,具体的规范可以参照
本地合并代码
git checkout newbranch
git merge origin/develop这两个命令将本地的 develop 分支代码合并到 newbranch 分支
删除本地分支
git branch -d <name>
强制删除:
git branch -D <name>
删除远端分支
git branch -a 查看远端和本地的所有分支
git push origin :远端分支 push一个空的到远端分支,注意origin 后面的空格
git 准备开发的流程
本地切换到 develop 分支,将远程 develop 分支拉到本地,合并 (*develop)
git pull origin develop
合并如果有冲突,
git status
、git diff
看是哪些文件有冲突,到文件里解决冲突,再git reset --merge
在 develop 上分出一个开发分支
xxx
(*develop)git checkout -b xxx
切换到 xxx 分支进行开发 (*xxx)
开发完毕提交操作
切换到 develop 分支,如果提示没有 commit 或者 stash 就 stash
在 develop 分支上拉取远端最新的代码
git pull origin develop
切换到开发分支
xxx
,将 develop 分支里最新的代码合并到开发分支git checkout xxx
git merge origin/develop如果有冲突,解决冲突重新合并
git reset --merge
提交开发分支中的改动
git add <file>
git commit -m "feat: xxx"在开发分支中 git log 时有之前的提交记录是正常的,提交到远端的新分支之后有之前的提交记录也是正常的,不要慌。创建 MergeRequest 的时候就只有这一次推送的提交了
如果add错了一个文件,
git restore --staged
可以撤销这个文件的推送到远端
git push origin xxx:yyy
使用这个命令后,会将本地的 xxx 分支推送远端自动新建的 yyy 分支
推送的是距离你从本次开发开始的提交记录,比如从远端拉下来合并之后有了commit1, commit2, commit3 这几个提交记录,本次开发过程中提交了两次:commit4 和 commit5,那么推送的也就是这两个记录,在创建 Merge Request 的时候 commits 也是 2
创建 Issue 和 MergeRequest
Issue 可以不在这个时候创建,开发功能之前就可以创建了,意味着自己要开发新功能了
MergeRequest 就是合并请求,我这里是新功能分支 合并到 develop 分支,merge 之后自动删除 userperm 分支。具体的看公司要求。
Q&A
已经 commit 但没有push ,想要撤销本次提交,但要保留代码修改?
使用
git log
打印提交记录,看到如下提交信息
现在,我们想要撤销第一个和第二个提交记录,但又不想代码也跟着回滚,于是,我们可以用
git reset --soft HEAD^
命令来撤销第一个提交,也就是bcee1b
的提交,然后再用一次git reset --soft HEAD^
就成功撤销这两个记录了。
你也可以使用git reset --soft HEAD~2
来一次性撤销两个提交记录,现在,我们使用 git log
查看提交记录:
可以看到已经撤销了两次提交。
使用这个命令,git add 操作不会被撤销,使用 git status
查看状态,之前 add 的记录还在:
![image][2]
撤销提交记录的同时不保留代码修改怎么做?
使用 git reset --hard HEAD^
就可以办到。这个命令会删除改动的代码,撤销 commit 和 add,恢复到上一次的 commit 状态。
恢复到上一次提交记录之后又后悔了怎么办?
刚刚使用了 git reset --hard HEAD^
命令恢复了上一次的 commit 状态,同时代码也没有被保存,如果后悔了,可以使用 git reflog
命令查看之前所有的提交记录和操作记录,找到需要恢复的那个版本,复制前面的 commitID,例如我们想要回到bcee1b4 这个版本:
![image][3]
使用命令,然后查看 提交记录:
![image][4]
又回来了。
在 commit 的时候写错注释了怎么办?
git commit --amend这个命令会默认进入 vim 编辑器,修改好注释之后保存就可以了。
已经 push 到远端还没合并,需要修改代码
如果已经将本地的开发分支 push 到远端,但是这个时候不管出于什么原因需要修改代码,但是修改好了之后提交到远端,发起 MergeRequest 的时候是没有原来的提交记录的。比如我第一次 push 的时候有 commit-1 的记录,现在在本地改了代码,有了 commit-2 的记录,然后 push 到了一个新的远端分支 zzz ,在这个新的分支上再建一个 Merge Request,那么这个 MergeRequest 里面就只有一个 commit。
可以参考第一个问题,在本地撤销前面的 commit 但保留更改,然后重新提交,这样下一次提交就包含了两次的修改。
或者也可以在修改代码之后 push 到远端上一次push 的 yyy 分支上,这样远端就有了两个 commit ,看自己的需求。
如何同步远程已删除的分支
删除远端多余分支
使用
git branch -a
命令查看本地和远程的所有分支,红色部分就是远端分支
可以看到,有的远端分支明明已经删除了,但本地并没有同步过来。
使用
git remote show origin
命令查看本地分支和远端分支的追踪情况
根据提示,可以使用 git remote prune
命令来同步删除这些分支。
git remote prune |
再次查看就已经删除这些多余的分支了image-20201106111856467](C:/Users/Lenovo/AppData/Roaming/Typora/typora-user-images/image-20201106111856467.png)
删除本地多余分支
git branch -D feature/chatfix |
[]: