git - 为什么在创建分支时git无法识别我?

标签 git github

创建分支时,它无法识别我的git名称,而是MV WAG SCM。参见下图。
git config --list产生:

credential.helper=osxkeychain
push.default=current
pull.default=current
pull.rebase=true
user.email="myname@gmail.com" -> This is correct
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
....items related to remote branches
username.user=myUserName -> This is correct
username.email="myname@gmail.com" -> This is correct

我也无法推动任何更改...怎么了?

最佳答案

这里有很多重要的事情要牢记。以下是前两个:

  • Git是分布式的,这意味着涉及很多不同的计算机。每个人对什么是什么都有自己的想法。
  • GitHub不是Git! GitHub是提供Git服务的托管公司。他们用花哨的界面隐藏了实际的Git实现。这个漂亮的界面不是Git的一部分,而且其中很多几乎根本不使用Git。

  • 现在,您显示的图像片段来自GitHub。因此,它向您展示了GitHub所说的内容,从字面上看,它与您现在可以在自己的Git存储库中设置的任何内容完全无关。它可能与您先前在Git信息库中(今天或昨天,昨天或任何时候)设置的内容有关。

    git config --list yields ...



    这些是您在计算机上设置的设置。您可以随时更改它们。

    请注意,您的个人设置有两个(或更多)不同的位置。 Git称这些为--global--local。 Git 2.20和2.21添加了一个新的--worktree,您可能没有使用过。使用git config --list --show-origin查看哪个位置存储了哪个设置。

    ....items related to remote branches

    username.user=myUserName -> This is correct
    username.email="myname@gmail.com" -> This is correct
    


    这些可能是正确的,但是我找不到使用username.userusername.email设置的任何内容。 (可能有些东西,但是Git允许您毫无抱怨地设置任何内容。例如,如果您应该为某软件设置zaphod.beeblebrox=heads:2,但是不小心运行了git config hoopy.frood towel,则Git对此不会有任何抱怨—两者都不对Git毫无意义。)

    push.default=current
    pull.default=current
    


    第一个是有意义的,但通常,大多数人应该保留push.default的默认simple设置。第二个没有意义。

    user.email="myname@gmail.com"
    


    这无疑是正确的。但是,您引用的列表中缺少的其余一个是user.name

    现在,重要的是要认识到,当您使用Git创建新的提交时,您的Git仅使用user.nameuser.email。那时(在您进行提交时),Git会读取这两个设置。无论其中包含什么内容,都进入新提交。新提交一旦完成,将一直冻结。您可以进行其他具有不同用户名和/或电子邮件设置的提交,并且如果刚进行的提交具有错误的设置,则可能应该进行另一次提交。但是,您所做的任何提交中包含错误内容的 promise ,将永远包含错误内容。

    还不错吧!您根本不必继续使用错误的提交。例如,如果您提交了错误的提交,则可以更改内容并运行git commit --amend抛出错误的提交,并用更好的提交替换它。抛出的那些保留在您的存储库中,但已被淘汰,您和其他所有人都看不到它,并且在运行git push时不会将其发送到其他Git。而且,例如,您可以使用git rebase -i --reset-author修复不仅仅是上一次提交的问题。像--amend一样,它不会更改任何提交。相反,它制作了新的和改进的,并停止使用旧的和糟糕的。1

    运行git log时,将显示您在配置中设置的用户名和电子邮件,该用户名和电子邮件已复制到您已经进行的任何提交中。这两个项目(用户名和电子邮件)可以是您想要的任何内容。没有人可以阻止您在此处使用其他人的姓名和电子邮件地址。这些提交将进入您计算机上的存储库,您可以使用自己的计算机执行任何操作。

    但是,既然您已经进行了一些新的提交,现在您可能希望让Git将这些新的提交发送到其他Git存储库。其他Git存储库可以托管在任何地方,包括GitHub上。如果您确实向GitHub发送了新的提交,那么他们不仅会相信您是Barack Obama还是其他人。因此,现在您必须进行身份验证。这是此设置可能起作用的地方:

    credential.helper=osxkeychain
    


    如果您通过https连接到GitHub,则Git将需要使用凭据帮助程序,这会告诉它使用哪个。如果您通过ssh连接到GitHub,则ssh具有其自己的独立机制。此credential.helper设置将被忽略。

    I also cannot push any changes... What's wrong?



    可能是以下两项之一或全部:
  • 您尝试向GitHub进行身份验证的尝试失败了:他们不相信您是您声称的身份。
  • 或者,他们确实相信您是您自称的人,但该人无权推送。

  • 根据您在此处发布的内容,我们无法确定是哪种情况。但是GitHub传递回您的Git并将您的Git传递给您的错误消息会告诉您是哪种情况(或者是否不太明显)。因此,找出您是如何进行身份验证(或身份验证失败)的,以及是否成功,是否具有推送权限。纠正其中的任何一个都是问题(也许两者都有)。

    一旦解决了所有这些问题,最后一个绊脚石就是:Git推送提交。请记住,我们之前曾说过,所有提交都将被永久冻结。当您的Git去向他们的Git发送提交时,您的Git会移交哈希ID,该ID与该提交相关,并且只有该提交;没有其他提交具有该哈希ID名称-并且,如果他们还没有该提交,则您的Git移交他们所需的一切,以便他们也可以拥有该提交。

    因此,在所有这种疯狂的Rube-Goldberg式机制都将您的提交传达到存储在GitHub上的Git存储库之后,它们将具有一些新的提交集-可能只是一个提交,也许是一整串的提交-他们以前没有。最后,您的Git将要求其Git设置其分支名称之一,或创建一个新的分支名称,以记住这些提交中的最后一个。2然后GitHub接收存储在这些永久冻结的提交中的电子邮件地址,并在一个巨大的数据库中查找它们。

    该数据库是GitHub(不是Git!)决定谁进行提交的方式。保持翻译及其正常运行取决于GitHub及其数据库。他们为此有两种不同的幻想方案。参见例如https://help.github.com/en/articles/what-happens-when-i-change-my-username和相关文章。他们还可以控制在现有的冻结提交中看到那些电子邮件地址时将其视为“您”的电子邮件地址。

    如果使用命令行Git,则可以在自己计算机上的存储库中看到Git存储的内容。如果您使用GitHub Web界面,则可以从Git存储的内容中看到GitHub所转换的内容。实际的存储在提交本身中,因此,除非您将提交存储在GitHub上的Git存储库中,否则GitHub无法进行任何翻译。

    1如果您已经通过运行git push向其他Git发送了错误的提交,则您有问题。这不一定是一个大问题,但最好在运行git push之前确保您具有正确的提交。在将这些错误提交分散到整个宇宙中数百万个其他Git克隆之前,甚至在GitHub上托管的另一个Git克隆之前,丢弃错误的提交以改进替换的提交要容易得多。不过,这里的真正意义在于,您不能更改提交,只能将其替换为新的和改进的提交。如果您在其他人看不到任何东西之前这样做,他们将永远不会知道您输入了错误的内容!

    2最后一次提交会自动记住它之前的哈希ID。那是最后一次提交的父项。父提交会记住其父级,后者会记住另一个父级,依此类推-因此从最后开始,Git可以向后工作。这个向后看的链条是存储库中的历史!从头开始显示一个提交,然后返回到其父级的行为是您或其他任何人可以查看历史记录的方式。提交及其关系(父,子,兄弟或完全不相关)确定存储在存储库中的历史记录。分支名称仅用作查找最后提交的方式。

    关于git - 为什么在创建分支时git无法识别我?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289543/

    相关文章:

    bash - 带有 SSH 的 git clone 只能在 Git Bash 中工作,不能在 Windows CMD 上工作

    java - 每次 git 推送都会删除未跟踪的文件

    通过清除存储库历史记录来释放 git 磁盘空间

    git - 从 GitHub 中删除 bin 可执行文件夹

    git - 从 github 中删除子项目提交

    python - 单元测试 python how tos

    ruby - 推送预提交 git 钩子(Hook) (Rubocop)

    git - GitHub Git 客户端中分离的 HEAD

    git - 推送到 github 后重命名提交消息

    git - 在 monorepo 中限制用户的访问权限