Git常用命令总结-提交代码
一、常用的提交代码流程
以下是一些Git常用的分支推送相关命令:
1、查询本地仓库当前分支
- 命令:
git branch
- 说明:列出本地所有分支,当前所在分支前会有一个
*
号标识。
2、切换分支
如有必要则使用下面命令切换到指定分支
- 命令:
git checkout <branch_name>
- 说明:切换到指定的分支。如果该分支不存在,会切换失败。如果要创建并切换到新分支,可以使用
git checkout -b <new_branch_name>
。
3、拉取指定远程仓库分支
协同开发时,建议提交代码前先拉取远程分支,防止变更冲突。如有冲突可以先把自己的代码暂存。
- 命令:
git pull <remote_name> <branch_name>
- 说明:从指定的远程仓库拉取指定分支的代码,并将其合并到当前本地分支。其中
<remote_name>
通常是origin
,表示默认的远程仓库。
4、提交本地代码到指定远程分支
- 提交暂存区的内容到本地分支
- 命令:
git commit -m "<commit_message>"
- 说明:将暂存区的内容提交到本地分支,
<commit_message>
是本次提交的描述信息,用于说明本次修改的内容等。(一般描述前可以添加上提交标识,以便团队成员更好地理解代码变更意图,eg:refactor:词库插入新分词使用二分查找替换线性查找。 具体有哪些标识,后面会详细介绍)
- 命令:
- 将本地分支的提交推送到指定远程分支
- 命令:
git push <remote_name> <local_branch_name>:<remote_branch_name>
- 说明:将本地分支
<local_branch_name>
的提交推送到远程仓库<remote_name>
的<remote_branch_name>
分支。如果本地分支名和远程分支名相同,可以简化为git push <remote_name> <branch_name>
。
- 命令:
5、推送本地代码到远程仓库分支
- 先将本地代码添加到暂存区
- 命令:
git add <file_path>
或git add.
- 说明:
git add <file_path>
用于将指定文件添加到暂存区,git add.
则会将当前目录下的所有更改文件添加到暂存区。
- 命令:
- 然后按上述“提交本地代码到指定远程分支”的步骤操作
- 先执行
git commit -m "<commit_message>"
提交到本地分支。 - 再执行
git push <remote_name> <local_branch_name>:<remote_branch_name>
推送到远程分支。
- 先执行
二、git pull详解
git pull
是用于从远程仓库拉取代码并合并到当前本地分支的重要命令,其基本语法git pull <remote_name> <branch_name>
有如下作用和相关信息:
作用
- 从指定的远程仓库
<remote_name>
拉取指定分支<branch_name>
的最新代码,并尝试将其合并到当前所在的本地分支。比如,当前在本地的main
分支,执行git pull origin dev
,就会从名为origin
的远程仓库拉取dev
分支的代码,并尝试合并到本地main
分支。
执行过程
- 远程分支跟踪信息获取:Git首先会根据
<remote_name>
和<branch_name>
确定要拉取的远程分支的位置和相关信息。它会参考本地保存的远程仓库配置信息,找到对应的远程服务器地址以及指定分支的名称。 - 远程代码拉取:Git与远程仓库建立连接,从远程服务器上获取指定分支
<branch_name>
的最新提交记录和文件更改。 - 合并到本地分支:拉取完成后,Git会尝试将拉取到的代码合并到当前本地分支。如果没有冲突,Git会自动进行合并,并更新本地分支的指针,使其指向新的合并后的提交。
与其他命令的关联
git pull
实际上是git fetch
和git merge
两个命令的组合操作。git fetch
负责从远程仓库获取最新的提交记录,但不会自动合并到本地分支,而git merge
用于将获取到的远程分支与当前本地分支进行合并。使用git pull
就相当于先执行git fetch <remote_name> <branch_name>
获取远程分支的更新,然后执行git merge <remote_name>/<branch_name>
将获取到的更新合并到当前本地分支。
可能出现的问题及解决方法
- 合并冲突:如果本地分支和远程分支在相同文件的相同位置有不同的修改,就会产生合并冲突。这时Git无法自动完成合并,需要手动解决冲突。可以通过编辑器打开冲突文件,按照Git标记的冲突区域,手动修改文件内容,保留正确的修改,删除冲突标记,然后使用
git add
命令将解决冲突后的文件添加到暂存区,最后执行git commit
完成合并提交。 - 权限问题:如果没有拉取远程分支的权限,会收到权限拒绝的错误提示。这种情况下,需要联系远程仓库的管理员,请求获取适当的权限。
- 网络问题:在拉取过程中,如果网络连接不稳定或中断,可能导致拉取失败。可以检查网络连接,重新执行
git pull
命令。
三、git cherry-pick命令优选指定的提交内容
在Git中除了使用git pull
命令拉取代码,还可使用git cherry-pick
命令来优选指定的提交内容,将一个或多个提交从一个分支应用到当前分支。其使用方法及相关注意事项如下:
基本语法
git cherry-pick <commit-hash>
,其中<commit-hash>
是要优选的提交的哈希值,是提交的唯一标识符。
操作步骤
- 查找提交哈希值:可通过
git log
命令查看提交历史,找到要优选的提交的哈希值。如:
git log --oneline
该命令会以简洁的格式列出提交历史,每行显示一个提交的简短哈希值和提交信息,从中找到目标提交的哈希值。
- 切换到目标分支:确保切换到要应用优选提交的分支,可使用
git checkout <branch-name>
命令。如要将提交优选到master
分支,可执行:
git checkout master
- 执行优选操作:使用
git cherry-pick
命令加上提交哈希值来优选指定提交。如要优选哈希值为abc123
的提交,可执行:
git cherry-pick abc123
Git会将该提交引入到当前分支,应用提交所包含的更改。
处理冲突
如果优选的提交与当前分支的内容有冲突,Git会暂停cherry-pick
操作并提示冲突。需手动解决冲突,即打开有冲突的文件,编辑内容,保留需要的部分,然后使用git add
命令将解决冲突后的文件标记为已解决,最后执行git cherry-pick --continue
继续优选操作。
批量优选
若要优选多个连续的提交,可使用提交范围。如要优选从abc123
到def456
之间的所有提交(包括abc123
和def456
),可执行:
git cherry-pick abc123..def456
若要优选多个不连续的提交,可在命令中列出多个提交哈希值,以空格分隔。如:
git cherry-pick abc123 def456 ghi789
其他参数说明
--no-commit
:只应用提交的更改,但不自动创建新的提交,可用于在应用更改后进行一些额外的修改或检查,再手动提交。--strategy
:指定处理冲突的策略,如--strategy=recursive
,可使用递归合并策略处理冲突。
git cherry-pick和git pull的区别
git cherry-pick
和git pull
是Git中两个不同的命令,它们的功能、应用场景等都有所不同,具体区别如下:
-
功能
git cherry-pick
:用于将指定的一个或多个提交从一个分支复制到当前所在分支。它会把选定提交所包含的更改应用到当前分支,并在当前分支创建一个新的提交,新提交的内容和选定提交的内容相同,但提交哈希值等信息会不同。git pull
:用于从远程仓库获取最新的代码,并将其合并到当前所在分支。它实际上是git fetch
和git merge
两个命令的组合,先从远程仓库下载最新的提交记录到本地的远程跟踪分支,然后将远程跟踪分支的内容合并到当前分支。
-
操作对象
git cherry-pick
:主要操作的是本地的提交记录,可以在本地的不同分支之间选择特定的提交进行复制和应用。git pull
:主要操作的是远程仓库和本地分支之间的交互,用于获取远程仓库的最新代码并更新本地分支。
四、如何撤回提交的代码
git commit
后和git push
后撤回提交的方法如下:
git commit后撤回提交
- 使用
git reset
命令- 软重置(Soft Reset):执行
git reset --soft HEAD~<n>
,将提交记录回退,暂存区和工作目录内容不变,<n>
为回退提交次数,撤回最近一次提交可执行git reset --soft HEAD~1
。 - 混合重置(Mixed Reset):
git reset HEAD~<n>
为默认行为,回退暂存区内容,工作目录文件不变,变为未暂存状态,如git reset HEAD~1
撤回最近提交,更改回到工作目录为未暂存状态。 - 硬重置(Hard Reset):
git reset --hard HEAD~<n>
会回退暂存区和工作目录的所有更改,丢弃指定提交之后的所有更改,git reset --hard HEAD~1
可彻底撤回最近一次提交,但可能导致未提交工作丢失。
- 软重置(Soft Reset):执行
- 使用
git stash
命令:先执行git stash save "optional-message"
保存当前更改,再git reset --hard HEAD
将HEAD指针重置为上一次提交状态,实现撤回提交,若后续要使用保存的更改,可通过git stash pop
恢复。
git push后撤回提交
- 使用
git revert
命令:执行git revert <commit-hash>
创建撤销提交,<commit-hash>
为要撤回的提交哈希值,编辑提交信息后保存,再git push origin <branch-name>
将撤销提交推送到远程仓库,<branch-name>
为分支名称。此方法不改变原有提交历史,适合团队协作,但撤回多个提交较繁琐。 - 使用
git reset
命令结合git push
:先git reset --hard HEAD~<n>
回退到指定提交,再git push origin <branch-name> --force
强制推送本地状态覆盖远程仓库状态。此方法可快速回退远程仓库状态,但会改变提交历史,可能导致团队协作问题,请谨慎操作哦O(∩_∩)O~。- 为什么使用
git reset
命令结合git push origin <branch-name> --force
这种方式?
首先要知道本地与远程仓库的关系,Git 是分布式版本控制系统,本地仓库和远程仓库是相互独立又需要保持同步的。git reset --hard HEAD~<n>
只是在本地回退到了指定提交,此时本地仓库的状态与远程仓库的状态已经不一致了,远程仓库仍然保留着被回退掉的那些提交记录。 - 为了使远程仓库的状态与本地一致,也就是实现撤回远程仓库上已推送的提交,就需要使用
git push
命令将本地回退后的状态推送到远程仓库。而--force
参数是必不可少的,因为默认情况下,Git 不允许将本地的提交历史覆盖远程仓库中已经存在的、且提交记录不同的历史。加上--force
参数后,就会强制推送本地的状态,让远程仓库的提交历史按照本地的情况进行更改,从而达到撤回远程仓库上指定提交的目的啦~
- 为什么使用
- 使用
git rebase -i
命令结合git push
:执行git rebase -i HEAD~<n>
,在文本编辑器中把要撤回提交前的pick
改为drop
,保存关闭编辑器完成变基,然后git push origin <branch-name> --force
将变基结果推送到远程仓库。此方法可灵活操作多个提交,但同样会改变提交历史,使用时需与团队成员沟通。
使用IDE集成工具代替命令
如果你用的是代码编译工具,以IntelliJ IDEA为例,打开项目,切换到Version Control面板,找到Git操作界面,在提交历史记录中找到要撤回的提交记录,右键点击选择Reset或Revert选项,按提示确认,IDE自动执行撤回操作,效果和上面的git命令一样哦。