自学内容网 自学内容网

git使用

1. git fetch vs git pull

git fetchgit pull 是 Git 中用于同步远程仓库和本地仓库的两个常用命令,但它们的行为和使用场景有所不同。以下是它们的区别和适用场景:


1. git fetch

  • 作用:从远程仓库下载更新(如新的提交、分支等)到本地的远程分支记录,但不会自动合并到本地分支。

  • 流程

    1. 检查远程仓库的更新。
    2. 将更新存储到本地的远程跟踪分支(如 origin/main)。
    3. 本地分支(如 main)不会自动改变。
  • 常见使用场景

    • 想了解远程仓库是否有更新,但不影响当前本地分支。
    • 想在合并之前手动检查差异。
  • 命令

    git fetch
    

    git fetch origin
    

2. git pull

  • 作用:从远程仓库下载更新,并直接将更新合并到当前本地分支。

  • 流程

    1. 等同于运行 git fetch
    2. 自动执行 git merge 或者 git rebase(视配置而定)。
  • 常见使用场景

    • 确定要直接同步远程分支的更新到本地分支。
    • 快速将远程更新应用到本地分支,无需手动执行 merge
  • 命令

    git pull
    

    git pull origin main
    

主要区别

特性git fetchgit pull
下载更新下载更新到远程分支记录,不影响当前本地分支。下载更新并直接合并到当前本地分支。
本地分支状态本地分支状态保持不变。本地分支会改变(可能导致冲突)。
合并操作不自动合并。自动合并(如果有冲突需要手动解决)。
控制程度提供更精细的控制,允许用户手动检查和合并更新。更简单直接,适合快速同步更新。

使用建议

  1. git fetch

    • 当你需要了解远程仓库的更新但不想立即修改本地分支时使用。
    • 配合 git loggit diff 检查远程和本地分支的差异:
      git diff main origin/main
      
  2. git pull

    • 在你确信需要将远程分支的更新直接同步到本地分支时使用。
    • 遇到冲突时,可能需要手动解决冲突后继续完成合并。

示例

场景:你在本地开发,但远程仓库有新提交。
  • 步骤 1:用 git fetch 检查更新

    git fetch
    

    查看差异:

    git log main..origin/main
    
  • 步骤 2:合并更新到本地
    如果检查后确认需要合并:

    git merge origin/main
    
  • 如果直接使用 git pull,等效于上述两步:

    git pull
    

总结:git fetch 更安全,更适合手动控制;git pull 更快捷,但可能带来冲突或意外更改。

2. git提交代码

2.1 git pull 先拉取最新代码,以防止提交冲突

命令描述git pull 会从远程仓库拉取最新的代码更新,并将其合并到本地分支。使用该命令是为了确保本地代码库是最新的,这样可以防止在提交代码时发生冲突。
用途:在开始提交代码之前,先拉取最新的远程代码,确保本地代码与团队其他成员的代码同步。

2.2 git status 查看当前文件更改状态

命令描述git status 显示当前工作目录和暂存区的状态,包括哪些文件已修改、哪些文件已添加到暂存区、哪些文件未跟踪等信息。
用途:检查当前代码库的状态,了解哪些更改还未提交,帮助确认下一步操作。

2.3 git add <file> 添加要提交的代码文件

命令描述git add <file> 将指定的文件添加到暂存区,准备提交到版本库。你可以指定单个文件,也可以使用 git add . 来将所有更改过的文件添加到暂存区。
用途:在修改文件后,使用该命令将文件的更改加入版本控制,待提交。

2.4 git commit 提交后会进入编辑状态,编辑提交信息和CR信息即可

命令描述git commit 用于将暂存区的文件提交到本地仓库。在执行该命令后,会进入一个编辑器,要求你输入提交信息,通常包括本次提交的内容描述和CR(Code Review)信息。
用途:提交本地更改,并为提交提供相关描述,以便后续查看版本历史。

2.5 arc diff 推送到CR

命令描述arc diff 是一个用于在 Phabricator 中生成差异(diff)的命令,它会将本地的 Git 提交推送到 Phabricator,供团队成员进行代码审查。
用途:将本地的更改提交给 Phabricator 进行代码审查,生成差异文件供其他开发者查看和评论。

2.5.1 arc diff --nolint

arc diff --nolint是 Phabricator 中 arc diff 命令的一个选项,它的作用是禁用代码检查(lint)功能。在使用 arc diff 提交代码时,默认会对代码进行 lint 检查,检查代码风格、错误和潜在问题。如果你不希望在提交过程中执行这些检查,可以使用 --nolint 选项来跳过这些检查
arc diff:用于将本地提交的代码生成一个差异(diff),并将其推送到 Phabricator 进行代码审查。
--nolint:禁用代码检查(lint),即不会在提交过程中进行代码风格、语法错误等检查。

2.6 arc land 合入代码

命令描述arc land 用于将经过代码审查的提交合并到目标分支(通常是主分支或开发分支)。它会自动解决合并冲突,并将提交推送到远程仓库。
用途:在代码审查通过后,使用该命令将更改合并到主分支或目标分支,并推送到远程仓库。

2.7 git reset HEAD^ 撤销最新提交–回滚

git reset HEAD^ 是 Git 中的一个命令,用于撤销最近的提交并将其恢复到暂存区或工作目录。具体来说,HEAD^ 指代当前 HEAD(即当前分支的最新提交)的上一个提交,即 “父提交”。

语法:

git reset HEAD^

解释:

  • HEAD:Git 中的 HEAD 指向当前分支的最新提交。
  • HEAD^HEAD^ 是对 HEAD 的引用,表示上一个提交,即 “父提交”。它相当于 HEAD~1,即当前 HEAD 的一个父节点。如果你想回到前两次提交,可以使用 HEAD^^HEAD~2
  • git resetgit reset 用于撤销某个提交,将代码库的状态回退到指定的提交。

行为:

git reset HEAD^ 会做以下操作:

  1. 撤销最近的提交

    • 如果在执行 git reset HEAD^ 后没有指定任何选项,它会将 HEAD 移动到上一个提交,也就是当前提交被“撤销”了,变成了未提交的修改。
    • 此时,修改依然保留在工作目录中和暂存区中,但它们不再属于某个提交。
  2. 影响工作区和暂存区

    • 默认情况下,git reset 是以 --mixed 模式执行的,这意味着:
      • 工作目录中的修改 会保留下来(即你之前提交的修改还在文件系统中)。
      • 暂存区的修改会被清除,也就是说,它们不再处于待提交状态。你需要重新使用 git add 将修改添加回暂存区,如果需要重新提交。

举个例子:

假设你有以下的提交历史:

A -- B -- C  (当前 HEAD)

如果执行 git reset HEAD^,相当于将 HEAD 指针回退到提交 B,提交 C 将会被撤销,修改会保留在工作目录和暂存区中。新的提交历史变成:

A -- B  (当前 HEAD)

但修改依然存在,并且在暂存区中。

选项:

  • --soft:如果你使用 git reset --soft HEAD^,那么:

    • HEAD 会被移动到父提交(即回退一个提交)。
    • 暂存区 会保留当前提交的修改。
    • 工作区 也会保留当前提交的修改,和 --soft 保持一致。
  • --hard:如果你使用 git reset --hard HEAD^,它会执行以下操作:

    • HEAD 被移动到父提交。
    • 暂存区和工作区的所有修改都会丢失,会完全回到上一个提交的状态,所有未保存的工作会丢失。

使用场景:

  • 撤销最近的提交:如果你想撤销最近的提交并保持修改,可以使用 git reset HEAD^,然后修改、重新提交。
  • 修复错误提交:如果你提交了错误的代码或信息,并希望从历史记录中删除它,而不丢失工作,可以使用 git reset HEAD^

注意:

  • git reset 是一个较为危险的操作,特别是 --hard 选项,因为它会丢失未提交的更改。使用时需谨慎,尤其是在公共分支上避免误操作。

2.8 update 已经提交过一次了,只是回滚但是没有撤销,第二次提交的时候,arc diff 可能进入编辑状态没有更新内容,写入update即可。

git add get_packPath_from_item.py ScanBucket.py
git commit
arc diff
git reset HEAD^
git status
git add ScanBucket.py get_packPath_from_item.py
git commit
arc diff --nolint
arc land
arc diff  # update merge
arc land

在使用 arc diff 提交代码时,如果你已经执行过一次提交并且进行回滚,但没有撤销提交内容,第二次执行 arc diff 时进入编辑状态且没有更新内容,这种情况通常是由于以下原因:

1. 回滚后的代码未改变

  • 在你回滚的过程中,代码已经恢复到上一次提交时的状态,并且并没有进行新的修改。如果没有新的代码更改,arc diff 会检测到没有实质性的更改,因此会进入编辑模式,但由于没有新的内容要提交,提示你需要输入提交说明并标记为“更新”。
  • 这种情况下,arc diff 认为你提交的代码与上一次提交是相同的,因此它会提示你输入更新内容。

2. 暂存区没有变化

  • arc diff 会检查暂存区(staging area)和工作区的变化。如果在回滚后,暂存区的内容和当前工作区没有变化,arc diff 也不会生成新的差异(diff)。这可能导致进入编辑模式,但没有新的变更提交。
  • 如果你回滚了提交但没有将更改添加到暂存区,arc diff 仍然会提示你进入编辑模式,但没有实际的代码变动要提交。

3. 提交信息没有变化

  • 如果 arc diff 发现没有实际的代码变动,但你仍然提交并且更新了提交信息,它可能会认为这是对现有提交的更新,因此你看到的只是提交信息的更新(“update”)。

解决方法:

  1. 检查文件是否有更改:使用 git statusarc diff 查看是否有任何实际的更改被检测到。如果没有,请检查是否需要修改或重新添加文件到暂存区。

  2. 确保暂存区有内容:在回滚之后,确认你是否将修改文件添加到暂存区(使用 git add)。如果没有,arc diff 会认为没有更改。

  3. 确保有实际的代码更改:如果你回滚后没有进行任何实际的修改,arc diff 会认为没有差异,所以会提示你进行更新。

总结:

arc diff 进入编辑模式但没有更新内容,通常是因为没有实质性代码更改或暂存区没有内容。如果你想提交更新的内容,确保在回滚后进行了修改,并将修改添加到暂存区。


原文地址:https://blog.csdn.net/weixin_42831564/article/details/144746696

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!