IDEA:Git相关

来自Wikioe
跳到导航 跳到搜索


关于:merge、rebase、cherry-pick、应用独立更改、应用独立文件

参见:IDEA_Doc:apply-changes-from-one-branch-to-another
  1. merge:
  2. rebase:
  3. cherry-pick IDEA:icons:cherryPick.svg:将某个 commit 应用到当前分支,会在 HEAD 新增一个 commit。
    • 中文插件翻译为“优选”。
  4. Apply separate changes(应用独立更改):将某个 commit 的 changes 应用到当前分支,会反应在 ChangeList 中。
    IDEA:Git:Apply separate changes.png
  5. Apply separate files(应用独立文件,IDEA:icons:get.svg):将某个 commit 的 files 应用到当前分支,会反应在 ChangeList 中。
    IDEA:Git:Apply separate files.png

关于:Resolve conflicts(冲突解决)

参见:IDEA_Doc:resolve-conflicts
IDEA:Git:Non-Conflicting&Conflicting Changes.png
  1. “Non-Conflicting Changes”:仅在左侧(或右侧)新增、修改、删除的冲突内容;
    • 可以通过:IDEA:icons:Apply All Non-Conflicting Changes.svgIDEA:icons:Apply Non-Conflicting Changes from the Left Side.svgIDEA:icons:Apply Non-Conflicting Changes from the Right Side.svg 来快速解决。
  2. “Conflicting Changes”:同时在左右两侧修改过的冲突内容;
    • 手动确定决解方案。


IDEA:Git:冲突解决.png

说明:

  1. 图标:
    • ×:忽略左/右侧;
    • >>:应用左/右侧,到当前冲突;
  2. 右键:
    • 接受左侧:接受左侧,用于当前冲突(但不忽略右侧);
    • 接受右侧:…类上…
    • 使用左侧 解决:接受左侧,用于当前冲突,并忽略右侧;
    • 使用右侧 解决:…类上…
    • 自动解决:综合左右,应用于当前冲突;
    • 忽略:忽略当前冲突;(保持原样)
  3. 按钮:
    • 接受左侧:接受左侧,用于所有冲突,并完成冲突解决;
    • 接受右侧:…类上…

关于:行末标识冲突

行末标识符:LF(Unix, Linux and MacOS),CRLF(Windows)

解决:

  1. 全局设置(通过命令):
    # on Windows
    git config --global core.autocrlf true
    
    # on Linux and macOS
    git config --global core.autocrlf input
    
  2. 仓库设置(通过配置文件“.gitattributes”):

关于:Shelve、Stash

参见:IDEA_Doc:work-on-several-features-simultaneously

Stash(保存工作现场)与 Shelve(搁置):

1、Stash 由 git 生成,可在 IDEA 内外使用;
   Shelve 由 IDEA 生成,在 IDEA 内使用。

2、Stash 将保存所有 uncommitted changes;
   Shelve 可以选择保存部分 uncommitted changes。

关于:Undo、Revert、Drop、Reset commit

参见:参见:IDEA_Doc:undo-changes.html


 关于“受保护分支”:
    ——本地“受保护分支”,可在 IDEA 中设置;
    ——如果远程分支为“受保护分支”,则本地迁出时也为“受保护分支”;

操作对照:

IDEA:Git:Option of commit.png

Undo(撤销)

“撤销上一次提交”(Undo the last commit),将会删除上一次的 commit,并将所有的更改保存到 Changelist

注意:

  • 不能对“受保护分支”(protected branch)操作。(若“受保护分支”的最近一个 commit 是“Unpushed”的则可以)
  • 只能对“最近一次、未提交”的 commit 操作。

Revert(还原)

“还原推送的提交”(Revert a pushed commit),将会产生一个新的 commit,用于反转要撤消的提交的效果。
    
    【反向修改,并提交】——直接还原效果,而非将修改保存到 Changelist。

注意:

  • 可以对任意 commit(不必是最近一次,不一定是一个)进行 Revert。
  • 如果对多个 commit 进行还原,仍然生成一个 commit,实现所有还原效果。
  • “Revert Commit”时,Changelist 中不能有未提交(可以搁置修改后,再操作)。
如果选定的提交包含多个文件,而您只需要还原其中的一些文件,请取消选择不想接触的文件。

??? 没找到咋操作

Revert selected changes

“还原选中的更改”(Revert selected changes),用于还原 commit 中的一个或多个 file,但不会产生 commit。而是作为更改,反应在 Changelist。

Drop(删除)

“删除一个提交”(Drop a commit)。

注意:

  • 不能对“受保护分支”(protected branch)操作。(若是“受保护分支”中“Unpushed”的 commit 则可以)

Reset(重置)

“将分支重置为特定提交”(Reset a branch to a specific commit),将会重置分支到指定的某个 commit,之后的 commit 全部丢弃不应将 git reset 用于回退“已经被推送到公共仓库上”的提交,它只适用于回退本地修改(从未提交到公共仓库中)。  ——如果需要修复一个“公共提交”,最好使用 git revert。


右键菜单为:“将当前分支重置为此处...”(Reset Current Branch to Here...)

可选择性地保留或丢弃:差异、本地更改:

IDEA:Git:Reset Option:“Reset Current Branch to Here...”.png


注意:

  • “Reset”不能被“Roll back”(Ctrl + Alt + Z)。
  • 丢弃的 commit,可以通过远程分支 pull、fetch、update 操作重新获取。
    • 但,若 Reset 之前有“Unpushed”的 commit,则无法找回。

关于:Edit Git project history

 参见:IDEA_Doc:edit-project-history


以下:不能对“受保护分支”(protected branch)操作。(对“Unpushed”commit 或许可以)

Edit a commit message

对于未 push 的 commit,可以修改其“commit message”。

Amend the previous commit

“修订前一个提交”(Amend the previous commit),用于向最近的 commit 追加修改(从 Changelist 中),而不产生新的 commit。

Amend any earlier commit???

“修订以前的任何提交”(Amend any earlier commit),用于向之前的某个 commit 追加修改(从 Changelist 中),而不产生新的 commit。

有两种方式,对于 commit message 的处理有所不同:

  1. squash:会将新提交消息添加到原始 commit;
  2. fixup:会丢弃新提交消息,只保留原始 commit 中的消息;
  • 这两个命令都需要 rebase,因为它们更改了 commit 的哈希值。

测试了一下,

    这两命令都会产生新的 commit,且对需要追加的 commit 之后的所有 commit 进行 rebase(会更改其 hashs)

    至于 commit message,都产生新的 commit 了,自然有新的 message。
    
    旧的 commit(需要追加内容的 commit)没有任何变化!!!

我以为是对某个 commit 追加修改,并将该修改依次应用到后续 commit 中(自然会通过 rebase 的方式重新提交后续的 commit)。
但是好像并不是这么回事,直接就在顶部产生新的 commit,而且新旧 commit 之间的 commit 的 hashs 也被更改了,不知道什么情况!

Squash commits

“压缩提交”(Squash commits),用于将以前的两个 commit 压缩为一个 commit。

Edit project history by performing interactive rebase

“交互式变基”(interactive rebase),在整合“当前分支”到其他分支前,通过“更改单个提交更改各提交顺序将多个提交压缩为一个提交跳过包含无关更改的提交”等方式清理提交历史记录。


???
参考 IDEA 文档中的相关内容说明!!!

Edit the history of the current branch

“编辑当前分支的历史记录”(Edit the history of the current branch)

Git 工具窗口 -> Log 页,右键菜单为:“从这里进行交互式变基...”(Interactively Rebase from Here...)

IDEA:Git:“Edit the history of the current branch”.png

Edit a branch history and integrate it into another branch

“编辑分支历史记录并将其集成到另一个分支”(Edit a branch history and integrate it into another branch)

Git 主菜单 -> Rebase:

IDEA:Git:“Edit a branch history and integrate it into another branch”.png
其后与上一节相当。

关于:“强制推送”

Git 的“强制推送”(git push --force-with-lease):强制推送本地分支到远程,将会忽略远程分支版本比本地高【即,抛弃比当前 commit 更高版本的 commit】;

【慎用!!!】

示例:

  1. 强制推送前:
    IDEA:Git:强制推送前.png
  2. 强制推送:
    IDEA:Git:强制推送.png
  3. 强制推送后:
    IDEA:Git:强制推送后.png

不能使用“强制推送”?

IDEA 不能对“受保护分支”(Git 相关设置中)进行强制推送。

“受保护分支”设置:

IDEA:Git:强制推送设置:“受保护分支”.png
  • 如上,删除或更改此处设置,则可以对 master 分支进行强制推送了。

关于:菜单栏的“Github”下相关选项

主要是关于“Pull Request”(Github 对于 fork 于他人仓库,进行协作开发):是 Github 的操作(而非 git),用于“请求源项目管理者拉取我的提交,以对源项目贡献开发”。


参见:Github:Pull requests
IDEA:Git:Github相关选项.png

FAQ

推送错误:“git@github.com: Permission denied (publickey).”

使用 IDEA 推送本地仓库到 GitHub 时,遇到错误:“git@github.com: Permission denied (publickey).”

错误信息:

  • IDEA git:
    IDEA:推送失败“git@github.com Permission denied (publickey)”.png
  • ssh 测试:
    SSH:测试连接git@github.com:失败.png
    • ssh -T git@github.com:用于测试 SSH 到 GitHub 是否可用;
    • ssh -vT git@github.com:用于测试 SSH 到 GitHub 是否可用,并会显示详细信息;
原因:推送到 GitHub 需要 SSH,当前未配置相关内容。

解决:

  1. 本地:
    1. 生成 SSH 密钥对:
      • 由于本地已存储了其他密钥对(“id_rsa、id_rsa.pub”),所以此处修改了存储文件名;
      C:\Users\eijux>ssh-keygen -t rsa -C "chen@eijux.com"
      Generating public/private rsa key pair.
      Enter file in which to save the key (C:\Users\eijux/.ssh/id_rsa): C:\Users\eijux/.ssh/id_rse_github
      ...
      
      SSH:生成github密钥对.png
      得到密钥对文件:“id_rse_github、id_rse_github.pub”;
    2. 新建 config 文件:
      • 由于修改了密钥文件的名称(或位置),所以需要 config 文件(C:\Users\eijux\.ssh\)进行配置;
      # github
      Host github.com
      HostName github.com
      PreferredAuthentications publickey
      IdentityFile C:\\Users\\eijux\\.ssh\\id_rse_github
      
  2. Github:配置 SSH keys
    1. 步骤:Setting -> SSH and GPG keys:“New SSH key”;
    2. 将本地生成的公钥“id_rse_github.pub”内容复制到 GitHub 的“New SSH key”;
      Github:添加 SSH key.png
  3. SSH 测试:
    ssh -T git@github.com
    # 或
    ssh -vT git@github.com
    
    SSH:测试连接git@github.com:成功.png