Git 命令操作完整指南(实际工作中常用命令)

目录标题

一、Git 初始化与基础配置

1、版本与状态检查

复制代码
# 检查 Git 版本
git --version

# 查看文件状态(简短格式)
git status -s

# 查看提交记录(单行显示)
git log --oneline

2、仓库初始化

复制代码
# 初始化本地 Git 仓库
git init

# 克隆远程仓库
git clone <远程仓库地址>

# 关联远程仓库
git remote add origin <仓库地址>

二、文件操作与提交

添加与提交文件

复制代码
# 添加所有文件到暂存区
git add .

# 提交到本地仓库
git commit -m "feat: 添加新功能"

# 提交所有修改(包括已跟踪文件的修改)
git commit -m "fix: 修改功能"

三、分支管理

1、分支查看与切换

复制代码
# 查看本地分支
git branch

# 查看远程分支
git branch -r

# 查看所有分支(本地+远程)
git branch -a

# 切换分支
git checkout main

# 创建并切换到新分支(创建分支并切换到该分支(只会创建本地分支dev,没有关联远程))
git checkout -b 分支名

# 重命名当前分支
git branch -M main

2、分支关联与同步

复制代码
# 创建本地分支并关联远程分支
git checkout -b dev origin/dev

# 查看本地与远程分支关联关系
git branch -vv

# 建立本地分支与远程分支的跟踪关联
git branch --set-upstream-to=origin/develop develop

四、远程仓库操作

1、推送代码

复制代码
# 推送到远程仓库(首次推送设置默认分支)
git push -u origin master

# 推送到指定分支
git push origin main

# 推送本地分支到远程(如:develop分支)
git push origin develop

2、拉取与同步

复制代码
# 拉取远程仓库更新
git pull origin master

# 获取远程最新分支信息(不合并)
git fetch origin

# 强制拉取并合并(允许不相关历史)
git pull origin develop --allow-unrelated-histories

五、标准工作流程

Dev → Main 合并流程

复制代码
# 1. 确保本地dev分支是最新代码
git checkout dev
git pull origin dev

# 2. 切换到main分支并合并dev
git checkout main
git merge dev

# 3. 推送合并后的main到远程
git push origin main

# 4. 切换回dev分支继续开发
git checkout dev

六、问题解决方案

1、未提交更改时的分支切换

git中 本地有更改没有提交,不能切换分支吗?(如何解决)

  • 方法1:提交修改‌:如果当前修改已经完成,可以使用 git add 和 git commit 命令将其提交到当前分支,之后工作区变"干净"即可切换分支

  • 方法2: ‌储藏修改(推荐)‌:如果工作尚未完成,不想提交,可以使用 git stash 命令将当前修改临时储藏起来。储藏后工作区会恢复到上一次提交的状态,此时可以切换分支。待切换回原分支后,使用 git stash pop 即可恢复储藏的修改

    方法1:提交修改(已完成的工作)

    git add .
    git commit -m "描述修改内容"

    方法2:储藏修改(推荐用于未完成的工作)

    git stash # 储藏当前修改
    git checkout 目标分支

    ... 在其他分支工作

    git checkout 原分支
    git stash pop # 恢复储藏的修改

2、远程分支关联问题

你在本地合并后无法推送代码到GitLab的main分支,主要是因为该分支被设置为‌受保护分支‌,而你的账户权限不足以直接向其推送代码。怎么办?

通过合并请求(推荐):在GitLab界面上(或者其他代码管理库),从你的特性分支向main分支发起合并请求。由具备Maintainer或Owner角色的人员审查并通过你的合并请求。

复制代码
# 当远程分支存在但本地无法关联时:

# 1. 获取远程最新分支信息
git fetch origin

# 2. 创建本地分支并关联远程
git checkout -b main origin/main

# 3. 或者为现有分支建立关联(将本地 develop 分支与远程分支 origin/develop 建立跟踪关联(upstream tracking)(当存在本地分支))
git branch --set-upstream-to=origin/develop develop

3、受保护分支推送问题

复制代码
# 当没有权限直接推送到受保护分支(如main)时:

# 1. 推送到特性分支
git push origin feature-branch

# 2. 在GitLab/GitHub上创建合并请求(Merge Request)
# 3. 等待有权限的维护者审查并合并

4、文件分割提交到不同分支

如果本地修改了很多文件,部分文件上传dev分支,部分文件上传daily分支,并且daily分支是基于dev分支的(需要创建的),那么命令行操作如下:

复制代码
# 假设已修改文件:
# - base1.js, base2.css (基础修改,属于活动a)
# - daily1.js, daily2.css (daily特有,属于活动b)

# 1. 确认当前在dev分支
git checkout dev
git pull origin dev

# 2. 查看所有修改
git status

# 3. 提交基础文件到dev分支
git add base1.js base2.css
git commit -m "feat(a): 更新基础页面到dev"
git push origin dev

# 4. 创建或切换到daily分支
git checkout -b daily  # 如果不存在
# 或 git checkout daily  # 如果已存在

# 5. 确保daily分支基于最新dev
git merge dev  # 如果daily已存在,合并最新dev

# 6. 提交daily专属文件
git add daily1.js daily2.css
git commit -m "feat(b): 添加daily专属功能"
git push origin daily

5、基于公共祖先+cherry-pick

关于git操作,目前gitlab有2个分支, dev分支(以前代码+活动a) daily(以前代码+活动a+活动b),现在想要创建一个分支要求(以前代码 + 活动b) 。

1、找到"以前代码"的基准点

复制代码
(需要找到活动a开始之前的最后一个提交。)
git log --oneline dev --decorate

示例:
e4f5g6h (HEAD -> dev) feat: 添加活动A功能
m1n2o3p chore: 初始化项目
这里m1n2o3p就是我们要找的"以前代码"。

2、创建基于"以前代码"的新分支

复制代码
# 1. 切换到基础提交
git checkout m1n2o3p

# 2. 创建并切换到新分支
git checkout -b feature-b-only

# 或者一步完成
git checkout -b feature-b-only m1n2o3p

验证
# 查看当前分支
git branch
# 输出:* feature-b-only

# 查看提交历史
git log --oneline -3
# 输出应该只显示到基础代码,没有活动a或活动b

3、找出活动b的所有提交

复制代码
现在我们需要找到daily分支上有但dev分支上没有的提交。
# 直接比较两个分支
git log --oneline daily ^dev
# ^dev 表示"在daily分支上但不在dev分支上"的提交

示例输出:这些就是活动b的所有提交。
> a1b2c3d feat: 添加活动B功能
> b2c3d4e fix: 修复活动B的bug

4、提取活动b的提交信息(可选)

复制代码
# 1. 将活动b的提交哈希保存到文件
git log --reverse --format="%H" daily ^dev > activity_b_commits.txt

# 2. 查看文件内容
cat activity_b_commits.txt
# 输出类似:
# b2c3d4e
# a1b2c3d

# 注意:--reverse 确保按时间顺序排列(从旧到新)
# 这对cherry-pick很重要!

5、执行cherry-pick(逐个cherry-pick(推荐,便于处理冲突))

复制代码
# 1. 确保在新分支上
git checkout feature-b-only

# 2. 按时间顺序cherry-pick(从旧到新)
# 假设活动b有两个提交:b2c3d4e(旧)和 a1b2c3d(新)

git cherry-pick b2c3d4e

# 如果没有冲突,会自动提交
# 如果有冲突,继续看下面的"处理冲突"部分

git cherry-pick a1b2c3d

6、处理cherry-pick过程中的冲突

复制代码
# 执行cherry-pick后如果有冲突会显示:
# Auto-merging some_file.js
# CONFLICT (content): Merge conflict in some_file.js
# error: could not apply jkl012... feat: 活动B-1
# hint: After resolving the conflicts, mark them with
# hint: "git add/rm <pathspec>", then run
# hint: "git cherry-pick --continue".
# hint: You can instead skip this commit with "git cherry-pick --skip".
# hint: To abort and get back to the state before "git cherry-pick",
# hint: run "git cherry-pick --abort".

查看冲突状态
git status
# 输出会显示:
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#   both modified:   some_file.js

# 方法1:手动编辑冲突文件
# 打开有冲突的文件,会看到类似:
<<<<<<< HEAD
当前分支的代码(来自基础代码)
=======
要cherry-pick的代码(来自活动b)
>>>>>>> feat: 活动B-1

# 你需要:
# 1. 删除 <<<<<<< HEAD, =======, >>>>>>> 这些标记
# 2. 保留正确的代码(应该是活动b的修改)
# 3. 保存文件

# 1. 添加解决后的文件
git add some_file.js

# 2. 继续cherry-pick
git cherry-pick --continue

# 3. 如果需要写提交信息,会打开编辑器
# 可以保留默认信息,保存退出

验证
# 查看提交历史
git log --oneline -10
# 应该显示:基础代码 + 活动b的提交

6、解决 daily 分支上的 cherry-pick 错误

上述如果弄错分支了,在daily分支上进行了,然后,并且本地分支变成了 (daily|CHERRY-PICKING),然后有好几个文件被改动了。

复制代码
# 1. 中止当前的 cherry-pick
git cherry-pick --abort

# 2. 验证状态已恢复
git status
# 应该显示 "On branch daily" 和干净的工作区

# 3. 查看分支状态
git branch
# 应该只显示 daily 分支(没有 CHERRY-PICKING 标记)

7、Git 提交信息修改指南(本地未推送)

本地 git commit 时候 提示信息写错了,如何撤回 ,注意要安全操作,本地修改还没有上传远程。

复制代码
# 修改最近一次提交的信息
git commit --amend

# 这会打开编辑器(如vim),你可以修改提交信息
# 保存退出后,提交信息就被修改了

# 或者直接指定新信息(不打开编辑器)
git commit --amend -m "新的提交信息"

七、完整项目初始化流程

复制代码
# 1. 初始化本地仓库
git init

# 2. 关联远程仓库
git remote add origin <你的GitLab仓库地址>

# 3. 创建并切换到开发分支
git checkout -b develop

# 4. 添加所有文件(排除.gitignore中指定的文件)
git add .

# 5. 初始提交
git commit -m "初始项目提交"

# 6. 拉取远程分支(如存在)并合并
# 从远程仓库的origin别名下的develop分支获取最新的提交历史记录,但不合并到当前分支
git fetch origin develop
# 拉取远程develop分支的内容,并与当前分支合并;如果两个分支的历史记录不相关,则使用--allow-unrelated-histories选项允许合并
git pull origin develop --allow-unrelated-histories

# 7. 推送到远程develop分支
git push origin develop

八、实用技巧

1、 查看关联关系

复制代码
# 查看所有分支及其追踪的远程分支
git branch -vv

2、安全拉取

复制代码
# 先获取更新信息,再决定是否合并
git fetch origin
git log origin/develop  # 查看远程更新内容
git merge origin/develop  # 确认后合并

3、Git Cherry-pick 顺序指南

cherry-pick的顺序至关重要!必须按提交的时间顺序进行(从旧到新)。

为什么顺序重要?

依赖关系:后续提交可能依赖于前面提交的代码修改

冲突减少:按顺序cherry-pick可以最大程度减少冲突

逻辑正确性:确保代码修改以正确的顺序应用

使用 --reverse 参数(推荐)

复制代码
# 查看daily分支有但dev分支没有的提交,按从旧到新排序
git log --reverse --oneline daily ^dev

# 输出示例:
# abc123 feat: 活动b-第一个功能
# def456 feat: 活动b-第二个功能
# ghi789 fix: 活动b-修复bug
# 顺序:abc123 → def456 → ghi789

如果顺序错了怎么办?

复制代码
# 如果发现顺序错了,需要重置
git cherry-pick --abort

# 重置分支到开始状态
git reset --hard 基础提交哈希

# 重新按正确顺序cherry-pick

记住这个黄金法则:cherry-pick的顺序 = 提交产生的顺序 = 时间从旧到新


使用提示

  • 在执行重要操作前,建议先使用 git status 确认当前状态
  • 推送代码前,先拉取最新代码避免冲突
  • 定期使用 git log --oneline 查看提交历史,保持清晰的提交记录

这个指南涵盖了从基础配置到高级操作的完整Git工作流程,帮助您更高效地进行版本控制管理。

相关推荐
HealthScience2 小时前
怎么使用git下载huggingface的文件
git
huangjiazhi_2 小时前
git clone next InitializeSecurityContext failed错误
git
_oP_i4 小时前
git gui设置github sshkey
git·github
ergevv4 小时前
Git 子模块(Submodule)操作指南
git·子模块·submodule
阿拉伯柠檬6 小时前
Git原理与使用(一)
大数据·linux·git·elasticsearch·面试
chao_7896 小时前
双设备全栈开发最佳实践[mac系统]
git·python·macos·docker·vue·全栈
大卫小东(Sheldon)1 天前
GIM 2.0 发布:真正让 AI 提交消息可定制、可控、可项目级优化
git·rust·gim
知识即是力量ol1 天前
研发实战:Git 规范化开发全流程指南
git·gitee·github
我是一只代码狗1 天前
idea创建分支
git