git使用小记

本文详细介绍了Git的常用操作,包括如何将本地项目上传到远程仓库,查看和删除远程仓库,创建、切换和合并分支,修改和删除分支,以及如何处理合并冲突。此外,还讲解了如何撤销和修改commit记录,提供了处理unrelated histories错误的方法。内容全面,适合Git初学者和日常开发中需要回顾Git操作的开发者。

一、将本地项目/分支上传到git远程仓库

// 1、本地项目创建好后,初始化git
git init

// 2、将本地仓库和远程仓库关联(如果没有远程仓库就创建一个)
git remote add origin 远程仓库地址 // (在远程仓clone地址)(远程库的名字就是origin,这是Git默认的叫法,也可以改成别的。)

// 3、将本地代码上传到远程
git push -u origin 远程仓库名 //(-u参数,Git不但会把本地的分支内容推送的远程新的分支,还会把本地的分支和远程的分支关联起来)

二、查看配置的远程仓库

git remote -v

三、删除本地指定的远程地址

git remote remove origin

有时我们在将本地仓库关联远程仓库时会报错,可以使用上面两步查看已关联的远程仓库,移除关联关系后,重新关联。

四、查看分支:

// 查看所有分支
git branch -a

// 查看本地分支最后一次的提交信息
git branch -v

// 查看本地分支关联的远程分支并会列出最后一次的提交信息和id
git branch -vv

五、创建新分支:

git branch 新分支 // 创建新分支

git checkout -b 新分支 // 创建并切换到新分支

git switch -c 新分支 // 创建并切换到新分支

六、切换到某个分支:

git checkout 分支名 

或

git switch 分支名

七、合并分支:

// 先切换到要合并的分支
git checkout 要合并的分支

// 执行合并
git merge 被合并的分支

例如:将b分支合并到a分支,而我当前在b分支

git checkout a

git merge b

git push 推送到远程

合并时有时会报错:

fatal: refusing to merge unrelated histories(拒绝合并不相关的历史)

出现这个问题的最主要原因在于本地仓库和远程仓库实际上是独立的两个仓库。

解决方法:

git pull origin 远程分支名 --allow-unrelated-histories  // 将远程仓库的文件拉取到本地仓库

// 比如上面b合并到a报错,可以这样操作:(在a分支中执行)
git pull origin b --allow-unrelated-histories

// 然后执行提交操作(有冲突要先解决冲突)
git add .
git commit -m 'xxx'
git push <远程主机名> <本地分支名>:<远程分支名> 或 git push
// 例如
git push origin main:main

假如我之前是直接clone的方式在本地建立起远程github仓库的克隆,本地仓库就不会有这问题了。

git push是git push origin main:main的一种简写形式

(1)当只关联一个远程,只有一个分支时,这两个命令没什么区别。

(2)当你关联了两个多个仓库、有多个分支时,git push可能会报错,因为它不知道要上传代码到哪里去;而git push origin main:main指定仓库和分支,就不会报错。

 八、修改分支名:

// 1、还没有推送到远程
git branch -m oldName newName

// 2、已经推送到远程
(1)git branch -m oldName newName // 修改本地分支名
(2)git push origin newName // 上传新命名的本地分支到远程仓库(会创建新的远程分支)
(3)git push -u origin newName // 将本地分支和远程仓库关联起来
(4)git push origin -d oldName // 删除远程旧的分支

九、删除分支:

// 删除本地分支
git branch -d 分支名

// 删除远程分支
git push origin -d 远程分支名

如果不确定分支名,删除前可以先查看所有分支,`git branch -a`会列出所有分支:

 以`remotes`开头的就是远程分支,其它为本地分支,*号代表当前所在的分支

比如删除远程分支master:git push origin -d master

十、删除或修改某条commit记录

1、git reflog // 得到最近的提交记录,能获取commitId

 

2、git rebase -i commitID // 比如 git rebase -i 9efb5ce
  • 执行完这个命令后,就可以看到 9efb5ce 的 commit 记录。如下图
  • 默认是使用 vim 编辑器打开了commit log list。然后我们就可以针对我们不需要的某些 log 进行删除。
  • 把原本的 pick 单词修改为 drop 就表示该ID对应的 commit log 我们需要删除。(pick改为edit或e,修改提交信息)
  • vim保存退出。

3、合并冲突并提交
git add .                   # 冲突时使用
git commit -m "new commit"  # 冲突时使用
git rebase --continue       # 冲突时使用
git push origin 远程分支名 -f  // -f 强制推送

然后现在去查看远程分支的此commit就没了。

十一、撤销commit

// 撤销最近一次的提交
git reset --soft HEAD^

HEAD^的意思是上一个版本,也可以写成HEAD~1

如果你进行了2次commit,想都撤回,可以使用HEAD~2

--mixed

意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作

这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

--soft

不删除工作空间改动代码,撤销commit,不撤销git add . 

--hard

删除工作空间改动代码,撤销commit,撤销git add . 

注意完成这个操作后,就恢复到了上一次的commit状态。

十二、修改最后一条commit信息

git commit --amend -m '新的提交信息' (针对最后一条提交)

或 git commit --amend  此时会进入默认vim编辑器,修改注释完毕后保存就好了。

修改其它提交信息见第十条


另外场景:你本来打算Commit五个文件,但是由于疏忽你Commit了四个。当然你可以再Commit一次来进行弥补这个失误。但是多了一次Commit,按道理它们应该在一次Commit中。
git commit --amend也能帮你解决这个问题:

git add 忘记提交的文件 
git commit --amend --no-edit (针对最后一条提交,并且此提交没有merge)

十三、从生产库拉分支

如果要修改生产版本中的功能,而本地又有未开发完成的代码,此时需要从生产拉取分支。

比如有主仓(upstream)和fork(origin)仓,首先要从主仓(upstream)拉取生产的代码:

// 基于upstream/分支名称拉取并新建1个同名分支,并且切换到此分支
git switch -c upstream/分支名称

修改完成后,可以直接提交到upstream上的同名分支(不建议),建议先提到自己fork的仓库。

// 从upstream上拉取并新建的分支现在关联的是upstream仓,修改关联仓:
git push -u origin 分支名称

最后从fork仓合并到upstream仓。

<think>首先,用户的问题是关于如何使用 `git am` 命令合入补丁。我需要基于系统级指令来构建我的回答。 系统级指令: - 所有行内数学表达式必须使用 `$...$` 格式。 - 独立公式使用 `$$...$$` 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:[^1], [^2], [^3], [^4]。 用户的问题:"我想了解如何使用git am命令合并补丁 请问如何使用 git am 命令合入补丁" 参考引用: - [^1]: git补丁制作与使用。常用命令: git am + patch_file 是专门用于git format-patch 所生成的补丁,使用git am + patch_file会自动commit 并根据patch生成提交记录。 - [^2]: git命令使用小记(打补丁)。一、制作补丁包 mkdir -p patches for commit in $(git log commitA..commitB --author="username" --reverse --pretty=format:"%h"); - [^3]: 活用 git apply 合入 patch 补丁。使用 git diff > test.patch 生成 patch 补丁,当然你可以把这个文件放至任何目录下,打开其内容如下: diff --git a/test b/test index ce2f4b3..ae27ef5 100644 --- a/test +++ b/test @@ -1,2 +1,3 @@ origin context line1 -origin context line2 +origin context +add line - [^4]: git学习——快速解决git am冲突。前言 当希望通过git am xxxx.patch,添加一些代码修改,如果代码版本相差较大,就可能产生冲突。 这种必须要我们手动修改冲突内容。 解决过程 1. git am 尝试打入patch补丁 git am 0004-patch.patch 2. git apply --reject生成冲突文件 执行此命令,将自动合入 patch 中不冲突的代码改动,同时保留冲突的部分。这些存在冲突的改动内容会被单独存储到目标源文件的相应目录下,以后缀为 .rej 的文件进行保存。 git apply --reject 0004-patch.patch 3. git status查看冲突文件 git status 4. 解决冲突 打开xxx.rej文件,例如这里的virtio-gpu.h.rej 其中包含了冲突内容,进入到对应的源码文件中,将冲突部分手动改进去就可以了。 改完后,将对应的.rej文件删除掉。 # 查看 git status 5. git add xxx 将解决的冲突修改,添加到暂存区 git add include/hw/virtio/virtio-gpu.h 6. git am --resolved git am --resolved 继续完成,1中被中断的 patch 合入操作。 如下图所示,applying:xxx,表示成功将该patch完整的加入到了项目代码中 参考文章 1. 定位和解决git am冲突的方法 我需要构建一个结构清晰的回答: 1. 解释 `git am` 是什么。 2. 描述基本用法。 3. 包括冲突处理。 4. 添加引用标识。 5. 生成相关问题。 6. 使用中文。 由于用户的问题中没有数学表达式,我不需要添加LaTeX数学部分,但指令说必须使用,所以我应该确保如果有数学部分就用,但在这里可能不相关。指令说“所有行内数学表达式必须使用$...$格式”,但在这个上下文中,git命令没有数学,所以我可能不需要添加任何数学。但为了安全,我可以避免它,除非必要。 回答结构: - 介绍 `git am`。 - 基本步骤使用 `git am`。 - 处理冲突的步骤。 - 生成相关问题。 引用添加:在引用段落末尾添加引用标识。例如,如果我引用[^1],就在那段末尾加[^1]。 最后,生成相关问题部分,用“§§相关问题§§”开头。 完整回答框架: 1. **介绍 `git am`**:解释命令的作用,基于引用。 2. **基本用法**:如何用 `git am` 合入补丁。 3. **冲突处理**:如果发生冲突,如何解决。 4. **相关问题**:列出几个相关问题。 使用引用: - 从[^1]:`git am` 是专门用于 `git format-patch` 生成的补丁。 - 从[^3]:生成补丁的方法。 - 从[^4]:解决冲突的详细步骤。 步骤: 1. 确保补丁文件是 `git format-patch` 生成的。 2. 运行 `git am patch_file`。 3. 如果冲突,使用 `git apply --reject` 等步骤。 现在,写回答。</think>### 如何使用 `git am` 命令合入补丁 `git am` 是 Git 中一个专门用于应用补丁文件的命令,它特别适用于处理由 `git format-patch` 生成的补丁文件。与 `git apply` 不同,`git am` 会自动创建提交记录,并将补丁中的更改直接应用到当前分支的提交历史中[^1]。这在协作开发中非常有用,例如在邮件列表或代码审查中传递补丁。下面我将一步步解释基本用法和冲突处理方法,确保您能顺利合入补丁。 #### 1. **基本用法:合入补丁文件** `git am` 的核心功能是读取补丁文件并自动应用更改。以下是标准步骤: - **前提**:确保补丁文件是用 `git format-patch` 生成的。这种文件格式包含了提交元数据(如作者、时间戳),这使 `git am` 能正确重建提交历史[^1]。如果补丁文件是通过其他方式(如 `git diff`)生成的,`git am` 可能无法正确处理。 - **命令格式**: ```bash git am <patch_file> ``` 例如,如果补丁文件名为 `fix-bug.patch`,运行: ```bash git am fix-bug.patch ``` 执行后,`git am` 会自动: - 应用更改到工作区。 - 创建一个新的提交,并使用补丁中的元数据(如提交消息)。 - 输出类似 `Applying: [提交消息]` 的确认信息[^1]。 如果操作成功,补丁就被完整合入到当前分支。您可以用 `git log` 查看新提交。 #### 2. **处理冲突:当补丁无法直接应用时** 如果目标代码与补丁有较大差异(如文件内容变更),`git am` 可能中断并报告冲突。这时需要手动解决冲突。以下是基于引用[^4]的详细步骤: - **步骤 1: 尝试应用补丁并检测冲突** 运行 `git am` 命令: ```bash git am fix-bug.patch ``` 如果冲突发生,Git 会输出错误信息(如 `Patch failed at [提交信息]`),并暂停应用过程。 - **步骤 2: 使用 `git apply --reject` 生成冲突文件** 执行以下命令: ```bash git apply --reject fix-bug.patch ``` 这会将不冲突的部分自动应用到代码中,冲突部分则保存为 `.rej` 文件(例如 `main.c.rej`)。这些文件位于源文件相同目录下,包含冲突的具体内容[^4]。 - **步骤 3: 查看冲突状态** 运行: ```bash git status ``` 这会列出所有冲突文件(如 `main.c.rej`)和修改过的文件。 - **步骤 4: 手动解决冲突** 打开 `.rej` 文件(如 `main.c.rej`),它用 diff 格式显示冲突行(例如 `-` 表示删除,`+` 表示添加)。编辑对应的源文件(如 `main.c`),手动合并冲突内容。完成后,删除所有 `.rej` 文件[^4]。 - **步骤 5: 添加解决后的文件** 使用 `git add` 将修改标记为已解决: ```bash git add main.c # 替换为您的文件名 ``` - **步骤 6: 继续应用补丁** 运行: ```bash git am --resolved ``` 这会完成中断的 `git am` 过程,并创建提交。成功后,输出 `Applying: [提交信息]`[^4]。 通过以上步骤,您能高效处理冲突,确保补丁完整合入。注意,`git am` 最适合 `git format-patch` 生成的补丁;对于普通 diff 补丁,建议先用 `git apply` 测试[^3]。 #### 3. **最佳实践** - **生成补丁**:使用 `git format-patch` 创建补丁。例如,生成从提交 A 到 B 的补丁序列: ```bash git format-patch commitA..commitB -o patches/ ``` 这会在 `patches/` 目录下生成多个 `.patch` 文件[^2]。 - **测试补丁**:在应用前,用 `git apply --check patch_file` 检查兼容性,避免意外中断。 - **性能**:`git am` 比手动应用更高效,因为它自动化了提交过程,减少了人为错误。 总之,`git am` 是一个强大的工具,能简化补丁管理流程。通过结合自动提交和冲突处理机制,它确保了代码变更的可追溯性和一致性[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值