Skip to content

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 在合并分支时发现有冲突,但没有指定如何解决冲突的方式。你可以按照提示中的建议来解决这个问题,以下是三种常见的方式:

  1. 使用合并(Merge):
  2. 运行 git pull 命令时,使用 git config pull.rebase false 来配置合并方式。
  3. 这会将你和你的同事的修改合并到一个新的提交中,Git 会自动解决冲突(如果有的话)。
  4. 在冲突解决后,你需要手动提交这个新的合并提交。

    git config pull.rebase false
    git pull
    
  5. 使用变基(Rebase):

  6. 运行 git pull 命令时,使用 git config pull.rebase true 来配置变基方式。
  7. 这会将你的修改应用在你同事的提交之上,使得提交历史看起来更加线性。
  8. 在冲突解决后,你需要继续变基操作或者运行 git rebase --continue

    git config pull.rebase true
    git pull
    
  9. 使用快进合并(Fast-Forward Only):

  10. 运行 git pull 命令时,使用 git config pull.ff only 来配置快进合并方式。
  11. 如果没有冲突,那么 Git 会尝试快进合并分支,否则会拒绝合并操作。

    git config pull.ff only
    git pull
    

场景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 检测到了冲突。

解决这个问题的步骤如下:

  1. 提交或者暂存你的本地修改:
  2. 如果你想保留你的本地修改,首先使用以下命令提交你的修改:

    git add clip_20230913_220901.txt
    git commit -m "Your commit message"
    
  3. 如果你不想提交这些修改,可以使用 git stash 命令来将它们暂存起来:

    git stash
    
  4. 执行 git pull 拉取远程更新:

git pull

这会合并远程分支(origin/master)的更改到你的本地分支。

  1. 解决任何可能出现的冲突:
  2. 如果在合并时发生冲突,Git 会自动停止合并,并将冲突标记在冲突的文件中。你需要手动编辑这些文件,解决冲突,然后使用 git add 将已解决的文件标记为已解决。
  3. 完成冲突解决后,运行 git commit 来提交这次合并的结果。

  4. 继续进行工作:

  5. 如果你在第一步中提交了本地修改,你可以继续工作并推送你的更改到远程仓库。
  6. 如果你在第一步中使用了 git stash 来暂存本地修改,可以使用 git stash applygit stash pop 来恢复这些修改,并在冲突解决后再次提交。

完成上述步骤后,你的本地分支应该与远程分支同步,并包含了你的修改和远程的更改。如果你在 git stash 步骤中使用了暂存,不要忘记在解决冲突后再次应用这些暂存的修改。

git回退到某个节点

如果你想回退到 Git 仓库的某个历史节点(commit),可以使用 git reset 命令。具体的操作取决于你想要回退的方式,有三种主要的选项:

  1. 软重置(Soft Reset): 这种方式会将 HEAD 移动到指定的历史节点,但不会修改你的工作目录或暂存区。这意味着你的修改不会被丢弃,你可以继续工作并重新提交它们。
git reset --soft <commit-SHA>

<commit-SHA> 替换为你想要回退到的历史节点的提交哈希值。

  1. 混合重置(Mixed Reset): 这种方式会将 HEAD 移动到指定的历史节点,并且会重置暂存区,但不会修改工作目录。这意味着你的修改会被保留在工作目录中,但不会被标记为暂存状态。
git reset --mixed <commit-SHA>

同样,将 <commit-SHA> 替换为目标历史节点的提交哈希值。

  1. 硬重置(Hard Reset): 这是最彻底的回退方式,它会将 HEAD 移动到指定的历史节点,并重置暂存区和工作目录,丢弃了你的本地修改。
git reset --hard <commit-SHA>

请务必小心使用硬重置,因为它会永久删除未提交的更改。

在执行上述命令之前,请确保你已经备份了重要的修改或文件,以免不小心丢失它们。另外,如果你回退到了之前的历史节点,并且这个分支已经推送到远程仓库,你可能需要使用 git push --force 命令来强制推送修改,因为你会修改分支的历史记录。强制推送要谨慎使用,特别是在多人协作的项目中,因为它可能会导致其他人的问题。