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 会暂停操作并提示你解决冲突。
- 解决步骤:
- 手动解决冲突。
- 使用
git add <file>标记解决的文件。 - 继续 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 会暂停合并并提示你解决冲突。
- 解决步骤:
- 手动解决冲突。
- 使用
git add <file>标记解决的文件。 - 继续合并:
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 merge 或 git rebase),你可以更好地控制如何将远程更改合并到本地分支。
恢复删除的commit
要恢复删除的提交,通常可以使用 git reflog 来找到被删除的提交,然后使用 git cherry-pick 或 git reset 来恢复它。以下是一个详细的步骤和示例:
使用 git reflog 和 git cherry-pick
场景
假设你在一个分支上误删除了一个提交,现在你想恢复它。
步骤
-
查看 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是你想恢复的提交。 -
恢复提交: 使用
git cherry-pick将该提交应用到当前分支。git cherry-pick abc1234这会将
abc1234的更改应用到当前分支。
使用 git reflog 和 git reset
如果你想恢复到某个提交并丢弃之后的所有更改,可以使用 git reset。
步骤
-
查看 reflog: 同样使用
git reflog找到你想恢复的提交的哈希值。git reflog -
重置到该提交: 使用
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 fetch 和 git pull 都是用于从远程仓库获取更新的命令,但它们的行为和用途有所不同。以下是它们的区别:
git fetch
-
作用:
git fetch从远程仓库获取所有更新的分支和提交,但不会自动合并到你的本地分支。它只是更新本地的远程跟踪分支。 -
使用场景: 当你想查看远程仓库的最新状态而不改变当前工作目录时,可以使用
git fetch。这让你有机会在合并之前查看和审查更改。 -
示例:
git fetch origin这会从
origin远程仓库获取所有更新,但不会改变当前分支。
git pull
-
作用:
git pull是git fetch和git merge的组合。它从远程仓库获取更新并立即将这些更新合并到当前分支。 -
使用场景: 当你想要快速更新当前分支以匹配远程分支时,可以使用
git pull。这适用于你信任远程更改并希望立即合并的情况。 -
示例:
git pull origin main这会从
origin远程仓库获取main分支的更新并合并到当前分支。
总结
git fetch: 仅获取更新,不合并。适合在合并前查看更改。git pull: 获取并合并更新。适合快速同步本地分支与远程分支。
选择使用哪一个取决于你的工作流程和对远程更改的信任程度。如果你希望在合并前查看更改,使用 git fetch;如果你希望快速同步,使用 git pull。