工作中git常用命令总结


git小白专用


前言

这是大三刚到公司实习遇到的一些git相关的问题,总结于此博客,本博客是无图的,大家可以根据目录选择自己想找的git命令, 感谢!


一、git revert

假设你提交了代码,发现自己提交的代码是有问题的,但是还没有发布版本(没有影响到别人),需要回到上一次对的代码,你可以用 revert , revert 跟 reset 有所区别,git reset 你一般没机会用的,都是leader管理终端的,用来帮你擦屁股,回退版本的,感兴趣的可以自己去看。

git revert 最大的特点是不会删掉你队友的代码,建议大家都用revert,即使你回退就只是上一次提交。

现在有一个情境,如下:

// commit-id     谁改的    备注
// (最新版本:你想回到你正确的代码)
// er3dgf4fs    pig     (队友代码)
// df21fs3sf    cissy   (错误的代码)
// fj4gg4ti4    cissy   (正确的代码)

这时候你可以用git revert [commit-id],

如果你队友中间没有push新的commit,你可以这么做:

# 1. revert 错误的那次
git revert df21fs3sf

# 2. 弹出一个vim, 建议把所有备注删光,黄色的还有灰色的字,然后:wq
# 3. 如果你只是想回到正确版本,不继续改代码你就:
git status
git commit -m "fix: 回到正确的修改"
git push
# 4. 如果你有改代码
git status
git add .
git commit -m "fix: 回到正确的修改和修复xxx的问题"
git push

如果你队友中间有push的话,你直接按步骤来:

# 1. revert 错误的那次
git revert df21fs3sf
# 2. 可能有冲突噢,你本地解决冲突,记得问问队友,看有没有删除他代码
# 3. 然后跟上面一样,继续改代码还是仅仅回退正确,看着来

如果你及其不放心,我十分建议你去腾讯工蜂,或者码云、github 建议仓库试试,避免影响到队友或客户


二、推送代码

前言:看清自己需要哪个功能,读清小标题

1. 创建一个本地分支:local/cissychou推送到远程分支:feature/cissychou

创建一个本地分支叫local/cissychou,并且切换到这个新的分支

 git checkout -b local/cissychou

这一步可跳:查看工作区的状态。

 git status

接下来两个都是老命令了,都熟。

 git add [你的文件]
 git commit -m "fix: 修复xxxx问题"

推送命令,如果你没有 feature/cissychou 这个远程分支会自动创建的。假设你在这一步出错,请看下面的”合并与冲突的解决“。

git push origin local/cissychou:feature/cissychou

推送成功还不够,还需要删除自己的远程分支(不要删除beta,v1,v2这种版本分支

# 查看所有本地分支
git branch

# 查看所有分支(包括了远程分支)
git branch -a

# 删除远程分支
git push origin --delete feature/cissychou
# 删除本地分支
git branch -d local/cissychou
# 同步最新的远程分支(仓库什么样子,就让本地是什么样子)
git remote update origin --prune

2. 本地master分支推送到主分支master

示例说明:这个情况不常用,导师一般都会让你提交到自己的分支,然后等他review再合并到主分支。每次push之前建议 git pull --rebase 一下(有冲突的话,解决完就git pull --continue,再push)

git checkout master
git add .
git commit -m "first commit"
git push

前端组件库开发push之前建议去跑一下lint-fix跟test:update命令不然会不通过,如果不通过就再次push,会覆盖上一次执行的流水线作业。


三、合并与冲突的解决

说明:先说一下合并,场景:你功能开发完,导师review完,就会叫你合并到主干上的了

第一步,先切换回主分支,因为你是在分支local/cissychou上开发的

git checkout master

更新一下主分支的代码,因为可能你队友更新了代码

git pull

再切换回本地local/cissy分支

git checkout local/cissychou

可选步骤:如果有多次local分支的提交,就合并,只有一次可以不合并(这步可有可无)

# HEAD~2 表示合并最新两次提交
git rebase -i HEAD~2  

下一步,将master内容合并到local/cissychou,这一步你可能需要解决冲突(解决完了就git add [冲突文件] 然后git rebase --continue,:q退出窗口),在分支上解决冲突就可以不那么污染主干代码了

git rebase master

接着就是合并一下本地local/cissy分支上的代码

git checkout master

git merge local/cissychou

最后推到远程仓库,

git push

合并成功!


下面来述说合并时产生冲突的解决:
你在merge过程中发现提示的了conflict这个单词,其实就是发生了冲突,这个时候你应该返回vscode或者其它工具看看你们冲突的地方在哪,然后手动解决冲突。解决完成后(包括你们小组用eslint时,没有通过就要重新以下步骤):

git add .

这里的commit备注你可以重复原先那个

git commit
git push

在这里建议去用rebase合并,就不用经过add、commit这一步了,直接rebase --continue,不用写多一条commit message,遇事不要慌,做好死备份!

补充一点,在你本地分支推送到某远程分支出错时:! [rejected] local/cissychou -> feature/cissychou (non-fast-forward) error: failed to push some refs.

造成错误的原因我自己也没分析出来(非常建议大家每次开发完就删除远程分支,一个新功能一个新分支),这里应该将分支代码跟主干代码同步,解决方法是这样的:

git fetch origin feature/cissychou
git merge origin feature/cissychou

这里有两种情况,第一种:

git pull origin feature/cissychou

上面git pull有可能发生冲突,本地解决完冲突之后,对照上面的步骤git add、commit一波,完事了它会说:

# Merge branch 'feature/cissychou' of http://gitlab.xxxxxxxxxxxx into local/cissychou

第二种:加了rebase的话,你gitlab的提交记录不会出现 “Merge branch xxxxx of into xxxxxxxxx” :

git pull origin feature/cissychou --rebase

最后一步仍然是提交代码

git push origin local/cissychou:feature/cissychou

四、commit备注相关

第一个,备注更改:

git commit -m "i am so god!"

#修改备注
git commit --amend -m  "i am so good!"

第二个,常用的提交备注的格式:

feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动, 或者库升级版本


五、拉取指定远程分支代码

当你不确定是不是因为你的改动而影响了,你可以拉取指定版本的代码,调试对比,场景:拉取 gitlab 上 biubiu 仓库 v1 分支的代码

git clone -b v1 http://gitlab.xxx.xxx/biubiu.git

git clone -b v1 http://gitlab.xxx.xxx/biubiu.git  [自定义的文件夹名(默认是仓库名)]

你在这个分支上修改了的话,直接参照”第二点:创建分支并推送“,新建本地分支,然后add,commit,push xxx:v1这样 就可以啦!


六、git stash 暂存更改

常用场景:本地修改了想要git pull拉取代码, 即git pull 失败,切换分支git checkout 失败

git stash

查看暂存列表:

git stash list

可以看到 stash@{0} 就是刚存的,然后git pull 拉取最新代码,还原暂存的文件:

git pull
git stash pop stash@{
    
    0}

你可能看到:

Auto-merging xxx
CONFLICT (content): Merge conflict in xxxxx

系统会自动合并修改的内容,但是其中有冲突,需要本地解决其中的冲突。或许你第二步pop的时候会有 error: Your local changes to the following files would be overwritten by xxx,你可以丢弃所有更改来换取pop成功,代价很大,尽量去问请教老大~


七、git cherry-pick

建议看阮一峰关于 cherry-pick 的日志,我这里做个汇总。常用场景:想把 master 的某几个功能加到 pre-production 分支(预发布环境):

# 先记录master分支上那几个功能相关的COMMIT SHA, 假设一共2个commit
# 切换到pre-production分支
git checkout pre-production

git cherry-pick 8582ea273f64ee8f2145b7a854ea6d5e69aba02d 8582ea293f64ee8f2140b7a854ea6d5e69aba02d

#如果冲突了,在vscode细细解决好
git add .
git cherry-pick --continue

#推送pick到分支上
git push origin pre-production

八、git submodule

关联子仓库,这种场景应该是挺常见的。git 是不支持直接在子目录git clone去关联子仓库的,在git add 的时候会报错。需要使用的是git submodule 命令关联:

# 进入到big仓库目录(或者big仓库子目录)
git submodule add https://git.xxx.com/test/mini.git 
git submodule add https://git.xxx.com/test/mini.git [新名称]
git submodule add -b v1  https://git.xxx.com/test/mini.git  

# 创建关联完成后会在根目录新增一个.gitmodules文件
# 接着提交代码

mini仓库被修改后,可以这样更新big仓库:

# 进入到big根目录
git submodule update --remote

详细的命令查看此链接

总结

这些已经基本够用了,不够我再补充。

猜你喜欢

转载自blog.csdn.net/qq_44622894/article/details/119169400