git 常用操作

439 阅读14分钟

Git 是一个功能强大的分布式版本控制系统,提供了许多命令来管理代码库。以下是一些常用的 Git 命令及其简要说明:

基本命令

  • git init: 初始化一个新的 Git 仓库。

    git init
    
  • git clone <repository>: 克隆一个远程仓库到本地。

    git clone https://github.com/user/repo.git
    
  • git status: 查看当前工作目录的状态。

    git status
    
  • git add <file>: 将文件添加到暂存区。

    git add file.txt
    
  • git commit -m "message": 提交暂存区的更改。

    git commit -m "Add new feature"
    
  • git push: 将本地提交推送到远程仓库。

    git push origin main
    
  • git pull: 从远程仓库拉取并合并更改。

    git pull origin main
    

branch 分支管理

git branch 是一个用于管理分支的命令,提供了多种操作来创建、删除、重命名和查看分支。以下是 git branch 的常用操作及示例:

查看分支

  • 命令: git branch

  • 作用: 列出所有本地分支,并标记当前所在的分支。

  • 示例:

    git branch
    
  • 命令: git branch -r

  • 作用: 列出所有远程分支。

  • 示例:

    git branch -r
    
  • 命令: git branch -a

  • 作用: 列出所有本地和远程分支。

  • 示例:

    git branch -a
    

创建分支

  • 命令: git branch <branch-name>
  • 作用: 创建一个新的本地分支。
  • 示例:
    git branch feature-branch
    

删除分支

  • 命令: git branch -d <branch-name>

  • 作用: 删除指定的本地分支(如果分支未合并,Git 会警告)。

  • 示例:

    git branch -d feature-branch
    
  • 命令: git branch -D <branch-name>

  • 作用: 强制删除指定的本地分支(即使未合并)。

  • 示例:

    git branch -D feature-branch
    

重命名分支

  • 命令: git branch -m <new-branch-name>

  • 作用: 重命名当前分支。

  • 示例:

    git branch -m new-branch-name
    
  • 命令: git branch -m <old-branch-name> <new-branch-name>

  • 作用: 重命名指定的分支。

  • 示例:

    git branch -m old-branch-name new-branch-name
    

查看分支的最后一次提交

  • 命令: git branch -v
  • 作用: 显示每个分支的最后一次提交。
  • 示例:
    git branch -v
    

查看已合并和未合并的分支

  • 命令: git branch --merged

  • 作用: 列出已合并到当前分支的分支。

  • 示例:

    git branch --merged
    
  • 命令: git branch --no-merged

  • 作用: 列出未合并到当前分支的分支。

  • 示例:

    git branch --no-merged
    

设置上游分支

  • 命令: git branch --set-upstream-to=<remote>/<branch>
  • 作用: 设置当前分支的上游分支。
  • 示例:
    git branch --set-upstream-to=origin/feature-branch
    

通过这些操作,你可以有效地管理 Git 仓库中的分支,帮助你在不同的开发任务之间切换和组织代码。

log 提交历史

git log 是一个非常强大的命令,用于查看 Git 仓库的提交历史。它提供了多种选项来格式化和过滤输出,以便更好地理解项目的历史。以下是 git log 的常用操作及示例:

基本用法

  • 命令: git log
  • 作用: 显示提交历史。
  • 示例:
    git log
    

简洁格式

  • 命令: git log --oneline
  • 作用: 以单行格式显示每个提交。
  • 示例:
    git log --oneline
    

限制输出数量

  • 命令: git log -n <number>
  • 作用: 显示最近的 <number> 个提交。
  • 示例:
    git log -n 5
    

显示特定作者的提交

  • 命令: git log --author="<author>"
  • 作用: 仅显示指定作者的提交。
  • 示例:
    git log --author="John Doe"
    

过滤提交信息

  • 命令: git log --grep="<pattern>"
  • 作用: 仅显示提交信息中包含特定模式的提交。
  • 示例:
    git log --grep="bug fix"
    

显示特定时间段的提交

  • 命令: git log --since="date" --until="date"
  • 作用: 显示在指定时间段内的提交。
  • 示例:
    git log --since="2023-01-01" --until="2023-12-31"
    

显示特定文件的提交

  • 命令: git log -- <file>
  • 作用: 显示对特定文件的提交历史。
  • 示例:
    git log -- path/to/file.txt
    

显示差异

  • 命令: git log -p
  • 作用: 显示每个提交的差异。
  • 示例:
    git log -p
    

格式化输出

  • 命令: git log --pretty=format:"<format>"
  • 作用: 使用自定义格式显示提交。
  • 示例:
    git log --pretty=format:"%h - %an, %ar : %s"
    

图形化显示

  • 命令: git log --graph
  • 作用: 以图形化方式显示提交历史。
  • 示例:
    git log --graph --oneline
    

合并多个选项

  • 命令: git log --oneline --graph --decorate --all
  • 作用: 结合多个选项,显示简洁的图形化提交历史,包括所有分支。
  • 示例:
    git log --oneline --graph --decorate --all
    

通过这些选项,你可以灵活地查看和分析 Git 仓库的提交历史,帮助你更好地理解项目的演变过程。

stash 临时保存

git stash 是一个非常有用的命令,用于临时保存工作目录的修改,以便在不提交的情况下切换分支或进行其他操作。以下是 git stash 的常用操作及示例:

1. 保存当前修改

  • 命令: git stash
  • 作用: 将当前工作目录的修改保存到栈中,并恢复到最近一次提交的状态。
  • 示例:
    git stash
    

2. 查看所有 stash

  • 命令: git stash list
  • 作用: 列出所有保存的 stash。
  • 示例:
    git stash list
    

3. 恢复最近的 stash

  • 命令: git stash apply
  • 作用: 应用最近的 stash 到当前工作目录,但不删除 stash。
  • 示例:
    git stash apply
    

4. 恢复并删除最近的 stash

  • 命令: git stash pop
  • 作用: 应用最近的 stash 到当前工作目录,并从 stash 栈中删除。
  • 示例:
    git stash pop
    

5. 删除最近的 stash

  • 命令: git stash drop
  • 作用: 删除最近的 stash。
  • 示例:
    git stash drop
    

6. 删除特定的 stash

  • 命令: git stash drop stash@{n}
  • 作用: 删除指定的 stash,其中 n 是 stash 的索引。
  • 示例:
    git stash drop stash@{0}
    

7. 删除所有 stash

  • 命令: git stash clear
  • 作用: 清空所有的 stash。
  • 示例:
    git stash clear
    

8. 创建带信息的 stash

  • 命令: git stash save "message"
  • 作用: 创建一个带有描述信息的 stash。
  • 示例:
    git stash save "WIP: working on feature X"
    

9. 查看特定 stash 的内容

  • 命令: git stash show stash@{n}
  • 作用: 查看指定 stash 的内容。
  • 示例:
    git stash show stash@{0}
    

10. 应用特定的 stash

  • 命令: git stash apply stash@{n}
  • 作用: 应用指定的 stash 到当前工作目录。
  • 示例:
    git stash apply stash@{1}
    

通过这些命令,你可以灵活地管理和应用工作目录的临时修改。

cherry-pick 合并特定commit到指定分支

git cherry-pick 是一个强大的命令,用于将特定的提交从一个分支应用到另一个分支。以下是 git cherry-pick 的常用操作及示例:

1. 基本用法

  • 命令: git cherry-pick <commit>
  • 作用: 将指定的提交应用到当前分支。
  • 示例:
    git cherry-pick abc1234
    

2. 多个提交

  • 命令: git cherry-pick <commit1> <commit2> ...
  • 作用: 将多个指定的提交应用到当前分支。
  • 示例:
    git cherry-pick abc1234 def5678
    

3. 范围选择

  • 命令: git cherry-pick <commit1>^..<commit2>
  • 作用: 将从 <commit1><commit2> 的所有提交应用到当前分支。
  • 示例:
    git cherry-pick abc1234^..def5678
    

4. 解决冲突

  • 操作: 如果在 cherry-pick 过程中发生冲突,Git 会暂停操作并提示你解决冲突。
  • 解决步骤:
    1. 手动解决冲突。
    2. 使用 git add <file> 标记解决的文件。
    3. 继续 cherry-pick:
      git cherry-pick --continue
      

5. 中止 cherry-pick

  • 命令: git cherry-pick --abort
  • 作用: 取消当前的 cherry-pick 操作并恢复到操作前的状态。
  • 示例:
    git cherry-pick --abort
    

6. 跳过当前提交

  • 命令: git cherry-pick --skip
  • 作用: 在发生冲突时,跳过当前的提交并继续下一个提交。
  • 示例:
    git cherry-pick --skip
    

7. 使用 -n 选项

  • 命令: git cherry-pick -n <commit>
  • 作用: 应用提交的更改,但不自动提交,允许你在应用更改后进行额外的修改。
  • 示例:
    git cherry-pick -n abc1234
    

8. 使用 -x 选项

  • 命令: git cherry-pick -x <commit>
  • 作用: 在提交信息中添加原始提交的引用,方便追踪。
  • 示例:
    git cherry-pick -x abc1234
    

通过这些操作,你可以灵活地将特定的提交从一个分支应用到另一个分支,帮助你在不同的开发分支之间共享代码更改。

merge 合并分支

git merge 是一个用于合并分支的命令,它将一个或多个分支的更改合并到当前分支。以下是 git merge 的常用操作及示例:

1. 基本用法

  • 命令: git merge <branch>

  • 作用: 将指定的分支合并到当前分支。

  • 示例:

    git merge feature-branch
    

    这会将 feature-branch 的更改合并到当前分支。

2. 快进合并(Fast-forward Merge)

  • 命令: git merge <branch>

  • 作用: 如果当前分支是目标分支的直接祖先,Git 会执行快进合并。

  • 示例:

    git merge feature-branch
    

    如果 feature-branch 是当前分支的直接后续,Git 会简单地将当前分支指针移动到 feature-branch

3. 非快进合并(No Fast-forward Merge)

  • 命令: git merge --no-ff <branch>

  • 作用: 强制执行非快进合并,即使可以快进合并。这样会创建一个新的合并提交。

  • 示例:

    git merge --no-ff feature-branch
    

    这会创建一个新的合并提交,即使可以快进合并。

4. 合并冲突解决

  • 操作: 在合并过程中,如果有冲突,Git 会暂停合并并提示你解决冲突。
  • 解决步骤:
    1. 手动解决冲突。
    2. 使用 git add <file> 标记解决的文件。
    3. 继续合并:
      git commit
      

5. 中止合并

  • 命令: git merge --abort

  • 作用: 取消当前的合并操作并恢复到合并前的状态。

  • 示例:

    git merge --abort
    

    这会中止合并并恢复到合并前的状态。

6. 合并特定提交

  • 命令: git cherry-pick <commit>

  • 作用: 如果你只想合并特定的提交而不是整个分支,可以使用 git cherry-pick

  • 示例:

    git cherry-pick abc1234
    

    这会将特定的提交 abc1234 应用到当前分支。

7. 合并策略

  • 命令: git merge -s <strategy> <branch>

  • 作用: 使用指定的合并策略。

  • 示例:

    git merge -s recursive feature-branch
    

    这会使用 recursive 策略合并 feature-branch

8. 总结

git merge 是一个强大的工具,用于将分支的更改合并到当前分支。通过理解和使用不同的合并选项和策略,你可以更好地管理代码库的合并过程。合并冲突是常见的,但通过正确的步骤可以轻松解决。

fetch 从远程仓库获取更新

git fetch 是一个用于从远程仓库获取更新的命令,但它不会自动合并这些更新到你的本地分支。以下是 git fetch 的常用操作及示例:

1. 基本用法

  • 命令: git fetch <remote>

  • 作用: 从指定的远程仓库获取所有更新。

  • 示例:

    git fetch origin
    

    这会从 origin 远程仓库获取所有更新的分支和提交。

2. 获取特定分支

  • 命令: git fetch <remote> <branch>

  • 作用: 从指定的远程仓库获取特定分支的更新。

  • 示例:

    git fetch origin main
    

    这会从 origin 远程仓库获取 main 分支的更新。

3. 获取所有远程更新

  • 命令: git fetch --all

  • 作用: 从所有配置的远程仓库获取更新。

  • 示例:

    git fetch --all
    

    这会从所有远程仓库获取更新。

4. 强制获取

  • 命令: git fetch --force

  • 作用: 强制获取更新,即使这会导致本地分支被重写。

  • 示例:

    git fetch --force origin
    

    这会强制从 origin 获取更新。

5. 获取并修剪

  • 命令: git fetch --prune

  • 作用: 获取更新并删除本地已删除的远程分支。

  • 示例:

    git fetch --prune origin
    

    这会从 origin 获取更新,并删除本地已删除的远程分支。

6. 获取特定标签

  • 命令: git fetch <remote> tag <tagname>

  • 作用: 从远程仓库获取特定的标签。

  • 示例:

    git fetch origin tag v1.0.0
    

    这会从 origin 获取名为 v1.0.0 的标签。

7. 获取并显示进度

  • 命令: git fetch --progress

  • 作用: 在获取更新时显示进度信息。

  • 示例:

    git fetch --progress origin
    

    这会从 origin 获取更新,并在过程中显示进度信息。

8. 总结

git fetch 是一个安全的命令,因为它不会改变你的工作目录。它允许你在合并更改之前查看远程仓库的最新状态。通过结合使用 git fetch 和其他命令(如 git mergegit rebase),你可以更好地控制如何将远程更改合并到本地分支。

恢复删除的commit

要恢复删除的提交,通常可以使用 git reflog 来找到被删除的提交,然后使用 git cherry-pickgit reset 来恢复它。以下是一个详细的步骤和示例:

使用 git refloggit cherry-pick

场景

假设你在一个分支上误删除了一个提交,现在你想恢复它。

步骤

  1. 查看 reflog: 使用 git reflog 来查看所有的 HEAD 变动记录,包括被删除的提交。

    git reflog
    

    输出示例:

    abc1234 HEAD@{0}: commit: Add new feature
    def5678 HEAD@{1}: commit: Fix bug
    789abcd HEAD@{2}: commit: Initial commit
    

    在这个例子中,假设 abc1234 是你想恢复的提交。

  2. 恢复提交: 使用 git cherry-pick 将该提交应用到当前分支。

    git cherry-pick abc1234
    

    这会将 abc1234 的更改应用到当前分支。

使用 git refloggit reset

如果你想恢复到某个提交并丢弃之后的所有更改,可以使用 git reset

步骤

  1. 查看 reflog: 同样使用 git reflog 找到你想恢复的提交的哈希值。

    git reflog
    
  2. 重置到该提交: 使用 git reset --hard 将当前分支重置到该提交。

    git reset --hard abc1234
    

    这会将你的分支恢复到 abc1234 的状态,并丢弃之后的所有更改。

示例

假设你在 main 分支上误删除了一个提交,现在你想恢复它。

# 查看所有的 HEAD 变动记录
git reflog

# 假设你找到了想要恢复的提交哈希 abc1234
# 使用 cherry-pick 恢复该提交
git cherry-pick abc1234

# 或者,如果你想重置到该提交并丢弃之后的更改
git reset --hard abc1234

注意事项

  • 数据安全: 使用 git reset --hard 会丢弃未提交的更改,请确保你不需要这些更改。
  • 备份: 在进行可能导致数据丢失的操作之前,建议备份你的工作目录。
  • 理解 reflog: git reflog 是一个本地记录,不会在克隆的仓库中共享,因此在其他机器上可能无法找到相同的记录。

通过这些步骤,你可以有效地恢复误删除的提交,确保代码的完整性和连续性。

git fetch 与 git pull 的区别

git fetchgit pull 都是用于从远程仓库获取更新的命令,但它们的行为和用途有所不同。以下是它们的区别:

git fetch

  • 作用: git fetch 从远程仓库获取所有更新的分支和提交,但不会自动合并到你的本地分支。它只是更新本地的远程跟踪分支。

  • 使用场景: 当你想查看远程仓库的最新状态而不改变当前工作目录时,可以使用 git fetch。这让你有机会在合并之前查看和审查更改。

  • 示例:

    git fetch origin
    

    这会从 origin 远程仓库获取所有更新,但不会改变当前分支。

git pull

  • 作用: git pullgit fetchgit merge 的组合。它从远程仓库获取更新并立即将这些更新合并到当前分支。

  • 使用场景: 当你想要快速更新当前分支以匹配远程分支时,可以使用 git pull。这适用于你信任远程更改并希望立即合并的情况。

  • 示例:

    git pull origin main
    

    这会从 origin 远程仓库获取 main 分支的更新并合并到当前分支。

总结

  • git fetch: 仅获取更新,不合并。适合在合并前查看更改。
  • git pull: 获取并合并更新。适合快速同步本地分支与远程分支。

选择使用哪一个取决于你的工作流程和对远程更改的信任程度。如果你希望在合并前查看更改,使用 git fetch;如果你希望快速同步,使用 git pull