Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以中断/重写历史的Git命令_Git_Github_Git Rewrite History - Fatal编程技术网

可以中断/重写历史的Git命令

可以中断/重写历史的Git命令,git,github,git-rewrite-history,Git,Github,Git Rewrite History,您能提供一个列表(所有或最常见的)可能破坏git历史记录的操作或命令吗 什么是绝对应该避免的 推送此提交后修改提交(git-commit/git-push/git-commit--Amend) 向已经推动的方向重新调整 我希望这个问题(如果它以前没有在其他地方问过的话)成为git上常见的可避免操作的某种参考 此外,我经常使用git reset,但我并不完全清楚我可能对存储库(或其他贡献者副本)造成的损害。git重置会有危险吗?从我的头顶: git提交--amend将重新写入上一次提交 git-

您能提供一个列表(所有或最常见的)可能破坏git历史记录的操作或命令吗

什么是绝对应该避免的

  • 推送此提交后修改提交(
    git-commit
    /
    git-push
    /
    git-commit--Amend
  • 向已经推动的方向重新调整
  • 我希望这个问题(如果它以前没有在其他地方问过的话)成为git上常见的可避免操作的某种参考


    此外,我经常使用
    git reset
    ,但我并不完全清楚我可能对存储库(或其他贡献者副本)造成的损害。git重置会有危险吗?

    从我的头顶:

    • git提交--amend
      将重新写入上一次提交
    • git-rebase
      可以重写多个提交(使用带有
      --rebase
      标志或
      分支$name.rebase
      配置选项的
      git-pull
      时也会调用rebase)
    • git筛选器分支
      可以重写多个提交
    • git-push-f
      可以更改提交一个分支指向的位置(git-push-origin+branch的语法也是如此)
    • git reset
      可以将提交分支点更改为
    • git branch-f
      可以更改提交分支所指向的位置(通过重新创建同名分支)
    • git checkout-B
      可以更改提交分支所指向的位置(通过重新创建同名分支)
    已经编写了一个很好的重写历史的命令列表,但我想在他的答案的基础上再进一步

    您能否提供一个列表,列出[…]可能破坏git历史记录的操作或命令?什么是绝对应该避免的

    首先,重写/删除历史本身没有错;毕竟,您可能会例行地创建特征分支,将它们严格地保留在本地,然后删除(在合并它们或意识到它们将使您一事无成之后),而不必三思而后行

    但是,当您在本地重写/删除其他人已访问的历史记录,然后将其推送到共享远程服务器时,您可能也肯定会遇到问题

    应视为重写/删除本地回购历史记录的操作 当然,有一些愚蠢的方法可以破坏或删除历史记录(例如篡改
    .git/objects/
    的内容),但这些都超出了我的回答范围

    您可以通过各种方式重写本地回购的历史记录。ProGit书籍中题为的部分提到了一些

    • git-amend--commit
    • git-rebase
    • git过滤器分支
    • Roberto Tyley的BFG回购清理器(第三方工具)
    可以说,还有更多。任何可能更改或以其他方式移动非符号引用(分支或标记)并使其指向不是分支当前tip后代的提交的操作都应视为重写本地历史。这包括:

    • git提交--amend
      :替换上一次提交
    • 所有形式的rebase(包括git pull--rebase)
    • git重置
      (参见下面的示例)
    • git checkout-B
      git branch-f
      :将现有分支重置为其他提交
    • git标记--force
      :重新创建具有相同名称但可能指向另一个提交的标记
    任何非符号引用(分支或标记)的删除也可被视为历史删除:

    • git branch-d
      git branch-d
    • git标签-d
    可以说,删除一个已经完全合并到另一个分支中的分支应该被认为只是一种温和的历史删除形式(如果有的话)

    不过,标签是不同的。删除一个轻量级标记并不是什么大事,但是删除一个带注释的标记,这是一个真正的Git对象,应该算作删除本地历史

    重写/删除远程回购历史记录的操作 就我所知,只有
    git push-f
    (相当于
    git push--force
    )有可能重写/删除远程存储库中的历史记录

    也就是说,有可能

    • 通过在服务器上设置
      receive.denynonfastforts
      ,禁用将远程分支强制更新为非快进引用的功能
    • 通过在服务器上设置
      receive.denyDeletes
      ,禁用删除位于远程存储库上的分支的功能

    此外,我经常使用
    git reset
    ,但我并不完全清楚我可能对存储库(或其他贡献者副本)造成的损害。
    git重置
    会有危险吗

    如所述,
    git reset
    ,通常会更改分支参考点的位置。此命令可能很危险,因为它会使可访问的提交变得不可访问。因为图片能说出一千个单词,请考虑以下情况:

    您在
    master
    分支上,该分支指向commit
    D
    。比如说,你跑步

    git reset master~2
    
    软重置被认为是最温和的重置形式,因为它“仅”更改当前分支指向的位置,但不会影响临时区域或工作树。也就是说,仅仅以这种方式更改分支指向的位置就会产生影响:在软重置之后,您将以

    在重置之前可从
    master
    访问的提交
    C
    D
    ,现在已无法访问;换句话说,它们不是任何引用(分支、标记或头)的祖先。你可以说他们处于“存储库的边缘
    git fast-export <options> | filter | git fast-import <options>