文章

常用git命令

常用git命令

Fork同步

  • 检查本地仓库状态
1
git status
  • 拉取远端源仓库更新
1
git fetch upstream
  • 切换到 master 分支
1
git checkout master
  • 合并远程的master分支
1
git merge upstream/master
  • 推送修改至 Fork仓库
1
git push

子模块恢复

  • 使用 git log 命令查找删除子模块之前的提交哈希值

  • 使用 git checkout 命令恢复 .gitmodules 文件和子模块路径。将 <commit-hash> 替换为步骤 3 中找到的哈希值,将 <path> 替换为子模块的路径。

    • 1
      
      git checkout <commit-hash> -- .gitmodules <path>
      
  • 使用 git status 命令查看仓库状态。应该会看到 .gitmodules 文件和子模块路径的更改。

  • 使用 git add 命令将 .gitmodules 文件和子模块路径添加到暂存区。

    • 1
      
      git add .gitmodules <path>
      
  • 使用 git commit 命令提交更改

    • 1
      
      git commit -m "Restore submodule"
      
  • 使用 git submodule update --init --recursive 命令初始化并更新子模块

    • 1
      
      git submodule update --init --recursive
      
  • 使用 git push 命令将更改推送到远程仓库


提交记录合并

假设要合并最近的三个提交。

1
git rebase -i HEAD~3

这将打开一个交互式 rebase 窗口,列出了最近的三个提交

  1. 编辑提交历史: 在弹出的编辑器中,你会看到一个包含你最近提交的列表。每个提交前面都有一个单词 pick。将除第一个以外的所有 pick 更改为 squashs。这样就将它们合并到第一个提交中。确保第一个提交的行保持 pick,这将成为合并后的提交。
  2. 保存并关闭编辑器: 保存并关闭编辑器。Git 将自动继续执行 rebase 操作。
  3. 编辑新的提交信息: Git 将打开另一个编辑器窗口,让你编辑合并后的提交信息。编辑信息以描述这些提交的整体内容。
  4. 完成 rebase 操作: 保存并关闭编辑器。Git 将应用 rebase,并将你的提交历史整理成一条新的提交。
  5. 推送到远程仓库(可选): 如果这些提交是你已经推送到远程仓库的,你可能需要使用 git push --force 强制推送来更新远程分支。

获取最近一次的git的提交文件路径集合

1
git diff-tree --no-commit-id --name-only -r HEAD

解释

  • git diff-tree:比较树形结构,适合用于查看提交文件变更。
  • --no-commit-id:不显示提交的 ID,仅显示文件列表。
  • --name-only:仅输出文件名而不包含详细信息。
  • -r HEAD:递归遍历指定的提交(此处为 HEAD,即最新一次提交)。
    • HEAD 可更换为指定的sha来获取制定的提交的内容

cherry-pick

feature-branch 分支中的提交记录 cherry-pick 到 main 分支上,步骤如下:

  1. 切换到目标分支(例如 main 分支):

    1
    
    git checkout main
    
  2. 从源分支(例如 feature-branch)中选择提交: 假设需要 cherry-pick feature-branch 上的某几个提交记录,可以先找到它们的 SHA 值:

    1
    
    git log feature-branch
    
  3. 执行 cherry-pick: 根据需要 cherry-pick 的提交记录,执行以下命令(假设 SHA 为 abc123, def456):

    1
    
    git cherry-pick abc123 def456
    

或者,如果这些提交记录在 feature-branch 上是连续的,可以直接指定范围:

1
git cherry-pick abc123^..def456

这样,这些提交记录就会从 feature-branch 被 cherry-pick 到 main 上了。

本文由作者按照 CC BY 4.0 进行授权