git多人提交时的冲突问题及其他git常用操作

与远程冲突

通常我们在提交代码之前会拉取一下远程仓库的代码, 所以产生的冲突也比较多, 比如我们先复制出两个仓库:

cp -r test1 test2 && ls -al

接着进入test1进行修改:

echo 1342sdasd > test.txt && git status

接着提交到远程仓库:

git commit -m '冲突解决' && git push

提交成功后我们回来继续, 进入test2仓库修改然后提交:

cd test2 && echo zxcxcsdaw > test.txt && git commit -m '冲突解决v2'

完成该操作后我们进行拉取:

git push

这个时候就会发生冲突, 原因在于之前我们修改了test.txt导致本地仓库不知道应该以本地的为准还是以远程仓库为准.
此时会提示我们自动合并出现冲突, 冲突出现在test.txt中. 这个时候我们需要手动修改test.txt

<<<<<< HEAD
zxcxcsdaw(本地仓库内容)
======
1342sdasd(远程仓库内容)
>>>>>> 98qjdwu2idjw129wje9uehhr3e2en2i

我们只保留zxcxcsdaw然后保存退出

git commit -a

rebase冲突

当我们使用git rebase命令复制另外一个分支的版本记录到当前分支时也可能产生冲突.
我们在两个分支中修改同一个文件的同一行代码来制造一个冲突出来:

git checkout test

修改test分支的a.txt

echo 123456 > a.txt && git status

然后提交

git commit -m '冲突3'

然后切换到develop分支中

git checkout develop

修改a.txt提交

echo 'zxcasdqwe' > a.txt && git status
git commit -m '冲突4'

完成后切换回test分支, 用git rebase赋值develop分支

git rebase develop

此时就会发生冲突, 冲突内容和上方基本一致, 我们需要手动删除不需要的代码然后提交

git add . && git rebase --continue
git rebase --skip

其他操作

  1. 对比分支差异

    git diff master dev stat
  2. 撤销上次操作(最近一次操作)

    git log
    git reset HEAD^
  3. 撤销指定操作

    git reset <commit hash>
  4. 撤销文件修改

    git checkout a.txt && git status
  5. 删除远程分支

    git branch -a
    git push origin --delete <远程分支名>
  6. 删除本地分支(远程分支不存在)

    git fetch --prune origin
    git branch -w
    git branch -d <分支名>
  7. 强制覆盖远程仓库

    git log
    git reset <commit hash>
    git push -f
  8. 远程仓库覆盖本地仓库

    git fetch(拉取远程仓库信息不自动合并)
    git reset --hard origin/分支名
  9. 恢复已删除分支

    git reflog show(显示分支)
    8sjds9wjf9 HEAD@{1}: commit: czczcx
    git checkout -b <新分支名> 8sjds9wjf9
    git log

    如果不小心使用了git reset回滚了提交记录, 想找回之前的提交记录, 可以使用git reflog查看操作历史, 找到执行git reset命令之前commit hash, 然后执行git reset --hard <commit hash>

  10. 工作区暂存

    git stash
    git stash list
    git stash apply <暂存编号stash@{0}>