Git
git操作文档¶
git冲突¶
场景1
在使用git项目协作过程中,我的同事将index.py修改完之后,push上去了,我也修改了这个文件,并且commit了, 但是当我pull的时候,提示了冲突:
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.
这个提示是 Git 在合并分支时发现有冲突,但没有指定如何解决冲突的方式。你可以按照提示中的建议来解决这个问题,以下是三种常见的方式:
- 使用合并(Merge):
- 运行
git pull命令时,使用git config pull.rebase false来配置合并方式。 - 这会将你和你的同事的修改合并到一个新的提交中,Git 会自动解决冲突(如果有的话)。
-
在冲突解决后,你需要手动提交这个新的合并提交。
-
使用变基(Rebase):
- 运行
git pull命令时,使用git config pull.rebase true来配置变基方式。 - 这会将你的修改应用在你同事的提交之上,使得提交历史看起来更加线性。
-
在冲突解决后,你需要继续变基操作或者运行
git rebase --continue。 -
使用快进合并(Fast-Forward Only):
- 运行
git pull命令时,使用git config pull.ff only来配置快进合并方式。 -
如果没有冲突,那么 Git 会尝试快进合并分支,否则会拒绝合并操作。
场景2
在使用git项目协作过程中,我的同事将index.py修改完之后,push上去了,我也修改了这个文件,但是还没add和commit,当我pull的时候,提示了冲突:
remote: Counting objects: 5, done
remote: Finding sources: 100% (3/3)
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), 263 bytes | 37.00 KiB/s, done.
From https://git.code.tencent.com/ig/weibo_hot
0412021..f97fbef master -> origin/master
error: Your local changes to the following files would be overwritten by merge:
clip_20230913_220901.txt
Please commit your changes or stash them before you merge.
Aborting
Updating 0412021..f97fbef
这个提示表明你的本地工作目录中的文件 clip_20230913_220901.txt 已经被修改了,但尚未提交(commit),而同时远程仓库上也有更新。因此,在执行 git pull 时,Git 检测到了冲突。
解决这个问题的步骤如下:
- 提交或者暂存你的本地修改:
-
如果你想保留你的本地修改,首先使用以下命令提交你的修改:
-
如果你不想提交这些修改,可以使用
git stash命令来将它们暂存起来: -
执行
git pull拉取远程更新:
这会合并远程分支(origin/master)的更改到你的本地分支。
- 解决任何可能出现的冲突:
- 如果在合并时发生冲突,Git 会自动停止合并,并将冲突标记在冲突的文件中。你需要手动编辑这些文件,解决冲突,然后使用
git add将已解决的文件标记为已解决。 -
完成冲突解决后,运行
git commit来提交这次合并的结果。 -
继续进行工作:
- 如果你在第一步中提交了本地修改,你可以继续工作并推送你的更改到远程仓库。
- 如果你在第一步中使用了
git stash来暂存本地修改,可以使用git stash apply或git stash pop来恢复这些修改,并在冲突解决后再次提交。
完成上述步骤后,你的本地分支应该与远程分支同步,并包含了你的修改和远程的更改。如果你在 git stash 步骤中使用了暂存,不要忘记在解决冲突后再次应用这些暂存的修改。
git回退到某个节点¶
如果你想回退到 Git 仓库的某个历史节点(commit),可以使用 git reset 命令。具体的操作取决于你想要回退的方式,有三种主要的选项:
- 软重置(Soft Reset): 这种方式会将 HEAD 移动到指定的历史节点,但不会修改你的工作目录或暂存区。这意味着你的修改不会被丢弃,你可以继续工作并重新提交它们。
将 <commit-SHA> 替换为你想要回退到的历史节点的提交哈希值。
- 混合重置(Mixed Reset): 这种方式会将 HEAD 移动到指定的历史节点,并且会重置暂存区,但不会修改工作目录。这意味着你的修改会被保留在工作目录中,但不会被标记为暂存状态。
同样,将 <commit-SHA> 替换为目标历史节点的提交哈希值。
- 硬重置(Hard Reset): 这是最彻底的回退方式,它会将 HEAD 移动到指定的历史节点,并重置暂存区和工作目录,丢弃了你的本地修改。
请务必小心使用硬重置,因为它会永久删除未提交的更改。
在执行上述命令之前,请确保你已经备份了重要的修改或文件,以免不小心丢失它们。另外,如果你回退到了之前的历史节点,并且这个分支已经推送到远程仓库,你可能需要使用 git push --force 命令来强制推送修改,因为你会修改分支的历史记录。强制推送要谨慎使用,特别是在多人协作的项目中,因为它可能会导致其他人的问题。