多人协作-Git管理
[TOC]
序:对Git有个基本的认识
Git 是一种分布式版本控制系统,它允许多个开发者在不同的环境中并行工作,同时提供了一种高效且可靠的方式来管理代码版本和历史。Git 的工作模式和流程主要包括以下几个方面:
【多人开发整体流程】
【同步主线分支工作流程】
1. 分布式架构
Git 是分布式的,每个开发者的工作目录包含整个项目的完整版本历史。这意味着每个本地存储库(repository)都是一个全功能的版本库,不需要始终依赖中央服务器。【换句话说就是所有人的本地存储库都有全部分支的代码】
2. 工作区和暂存区
Git 工作模式中,常见的术语和概念包括:
- 工作区(Working Directory/Working Tree):这是你当前正在开发的文件系统目录,包括所有源代码文件和目录。
- 暂存区(Staging Area/Index):这是一个临时区域,用于存放将要提交到版本库中的更改。你可以选择哪些更改需要提交。
- 版本库(Repository):这是一个存储所有已提交变更记录的地方,包含了所有的历史提交(commits)。
3. 常见命令和工作流程
克隆仓库
从远程仓库获取代码:
1 | git clone <repository-url> |
查看状态
查看当前工作区的状态,包括未跟踪文件、已修改文件和已暂存文件:
1 | git status |
添加文件到暂存区
将文件从工作区添加到暂存区:
1 | git add <file-name> |
提交更改
将暂存区的内容提交到本地版本库:
1 | git commit -m "Commit message" |
查看提交历史
查看项目的提交历史记录:
1 | git log |
分支操作
Git 允许同时开发多个分支,每个分支都是一个独立的开发环境:
列出所有分支:
1
git branch
创建新分支:
1
git branch <branch-name>
切换到另一个分支:
1
git checkout <branch-name>
新建并切换到新分支:
1
git checkout -b <branch-name>
合并分支
将一个分支的更改合并到当前分支:
1 | git merge <branch-name> |
处理冲突
合并过程中如果发生冲突,需要手动解决冲突并继续完成合并。
推送更改到远程仓库
将本地提交推送到远程仓库:
1 | git push origin <branch-name> |
拉取远程仓库的更改
从远程仓库获取并合并更改到本地分支:
1 | git pull |
4. 分布式开发
由于 Git 是分布式的,每个开发者可以独立地工作,提交更改,创建和合并分支。因为每个仓库都包含完整的历史记录,开发者可以在离线状态下执行大部分操作。最后,使用 git push
和 git pull
同步远程仓库中的变更,与团队成员进行共享和协作。
常见操作Tips
一.个人分支同步主线代码
一般步骤如下:
确认当前所在分支,使用
git branch
命令查看当前所在分支,如果不在个人分支上,可以使用git checkout
命令切换到个人分支。拉取主线代码,使用
git fetch
命令拉取主线代码,该命令会将主线代码的最新版本下载到本地,但不会自动合并到当前分支。1
git fetch origin main
合并主线代码,使用
git merge
命令将主线代码合并到个人分支上,该命令会将主线代码合并到当前分支,并生成一个新的合并提交。1
git merge origin/main
解决冲突,如果合并过程中出现冲突,需要手动解决冲突,然后使用
git add
命令将修改后的文件添加到暂存区,最后使用git commit
命令提交合并结果。1
2git add .
git commit -m "Merge main branch"推送个人分支,使用
git push
命令将个人分支推送到远程仓库。1
git push origin <personal-branch>
以上是个人分支同步主线代码的一般步骤,具体操作时需要根据实际情况进行调整。
2.手动解决 Git 冲突的一般步骤如下:
执行
git status
命令,查看哪些文件存在冲突。打开存在冲突的文件,查看冲突的内容。冲突的内容通常会被包含在一对
<<<<<<<
、=======
、>>>>>>>
标记之间,其中<<<<<<<
标记之前的内容是当前分支的修改,>>>>>>>
标记之后的内容是合并分支的修改,=======
标记之间是两个分支的修改内容。根据需要修改冲突的内容,删除不需要的标记,保留需要的修改内容。
使用
git add
命令将修改后的文件添加到暂存区。1
git add <conflicted-file>
如果还有其他存在冲突的文件,重复步骤 2-4。
执行
git commit
命令提交合并结果。1
git commit -m "Resolve conflicts"
如果还有其他需要合并的分支,重复步骤 1-6。
最后执行
git push
命令将合并结果推送到远程仓库。1
git push origin <branch-name>
以上是手动解决 Git 冲突的一般步骤,具体操作时需要根据实际情况进行调整。
二、Git怎么cherry-pick某个提交或者某几个提交
在Gitee上进行cherry-pick操作,可以按照以下步骤进行:
1.打开需要进行cherry-pick操作的仓库,找到需要合并的提交记录的commit ID。
2.在本地克隆该仓库,并切换到需要合并的分支。
3.执行以下命令,将需要合并的提交记录应用到当前分支:
git cherry-pick <commit ID>
其中,
4.如果合并过程中出现冲突,需要手动解决冲突,并执行以下命令,将解决冲突后的代码提交到当前分支:
git add .
git commit -m "Merge commit message"
其中,”Merge commit message”是合并提交的说明信息。
5.将合并后的代码推送到远程仓库:
git push origin <branch name>
其中,
需要注意的是,cherry-pick操作会将指定的提交记录应用到当前分支,并生成一个新的提交记录。因此,在进行cherry-pick操作时,需要仔细检查合并的提交记录,以避免不必要的错误和冲突。
【详细介绍】:
git cherry-pick
是 Git 中用于将一个或多个特定提交(commit)从一个分支应用到另一个分支的命令。这个操作的目的是有选择性地在不同分支之间移动特定的修改,而无需合并整个分支。
Cherry-pick 的用法示例
假设你在一个分支(如 feature-branch
)上做了一些修改,并进行了提交,现在你想把其中一个或多个提交应用到主分支(如 main
)上,那么你可以使用 git cherry-pick
。
基本用法
1 | git checkout main #先切换到main分支 |
多个提交
如果你想一次性 cherry-pick 多个提交,你可以指定一系列提交的哈希:
1 | git cherry-pick <commit-hash1> <commit-hash2> ... <commit-hashN> |
连续范围的提交
可以使用范围指定连续的提交:
1 | git cherry-pick <commit-hash1>^..<commit-hash5> |
例子
假设 feature-branch
上有以下提交:
1 | a---b---c---d---e (feature-branch) |
而你现在在 main
分支上,想要将提交 c
和 d
应用到 main
上:
1 | git checkout main |
这将把 feature-branch
上的 c
和 d
提交应用到 main
分支。
使用 Cherry-pick 的情景
- 错误修复:在功能分支上修复了一个严重的 bug,想立即将修复应用到主分支。
- 功能迁移:将某些功能或更改从一个实验性分支移动到主分支或其他分支。
- 精细控制:需要更高的合并控制而不是整个分支的合并。
注意事项
- 冲突处理:cherry-pick 操作中可能会产生代码冲突,需要手动解决冲突并完成提交。
- 原始提交信息保留:cherry-pick 会保留原始提交的信息(如提交消息和作者),但会生成新的提交哈希。
git cherry-pick
是一个非常有用的工具,它提供了在 Git 中细粒度控制版本历史的功能,使得在不同分支之间移动特定修改变得简单和高效。
三.问:如果下载一个git仓库,有多个分支,本地默认只有一个main分支,怎么从其他远程分支创建子分支,并与之关联起来?
方法一:使用checkout从指定的远程分支派生本地分支
如果你下载了一个Git仓库,其中有多个分支,但本地默认只有 main
分支,想要从其他远程分支创建一个本地子分支并与之关联起来,可以按照以下步骤操作:
步骤一:查看远程分支
查看所有远程分支:
1
git branch -r
这将列出所有远程分支,你可以选择其中一个作为你要创建的本地分支的源头。
步骤二:创建从远程分支派生的本地分支
从远程分支创建本地分支:
1
git checkout -b new_local_branch_name remote_branch_name
这会创建一个名为
new_local_branch_name
的本地分支,并与remote_branch_name
的远程分支关联。
步骤三:推送本地分支到远程仓库
推送本地分支到远程仓库:
1
git push -u origin new_local_branch_name
这会将你新建的本地分支推送到远程仓库,并建立起本地分支和远程分支之间的追踪关系。
现在,你已经成功地创建了一个从其他远程分支派生的本地子分支,并与其关联起来。可以在这个新的本地分支上继续开发工作,提交更改,并将更改推送到远程仓库的相关分支上。
步骤四:查看本地分支和远程分支关联关系
1 | test@DESKTOP-11QS5CC MINGW64 /e/my_github_repo/Coding_fragment (test) |
四.git 怎么回退版本,切换版本
在 Git 中,有多种方法可以回退版本或切换版本,取决于你具体的需求和场景。以下是常见的操作方法:
1. 查看提交历史
首先,使用 git log
查看提交历史,找到你希望回退或切换到的版本对应的提交哈希(commit hash)。
1 | git log |
这会显示提交历史记录,其中包括每个提交的哈希值、提交消息、作者和日期等信息。
2. 回退到特定提交
使用 git reset
git reset
命令可以用来回退到某个特定的提交。它有多种模式,每种模式的作用不同。
- Mixed 模式(默认模式):保留工作目录中的更改,但将当前分支的指针移回到指定的提交。暂存区(index)也会回退到指定的提交。
1 | git reset <commit-hash> |
- Soft 模式:保留工作目录和暂存区中的更改,仅仅移动当前分支指针。
1 | git reset --soft <commit-hash> |
- Hard 模式:彻底回退到指定的提交,所有本地的更改和提交历史后退至该提交之后的内容会被完全删除,工作区也会被重置。
1 | git reset --hard <commit-hash> |
使用 git revert
git revert
命令不删除提交历史,而是创建一个新的提交,应用一个反向更改,从而达到回退的效果。
1 | git revert <commit-hash> |
这对团队协作非常有用,因为它不会破坏已有的提交历史。
3. 切换到特定版本
使用 git checkout
git checkout
命令可以用来切换到特定的提交或分支。
- 切换到指定的提交:这会将你的 HEAD 移动到指定的提交,但不会修改当前分支的指针。这种状态被称为“分离头指针”(detached HEAD)状态。
1 | git checkout <commit-hash> |
- 切换到指定的分支:
1 | git checkout <branch-name> |
使用 git switch
从 Git 2.23 开始,引入了 git switch
命令,用于切换分支,语法上更明确,不容易误用。
- 切换到指定的分支:
1 | git switch <branch-name> |
- 切换到指定的提交(分离头指针状态):
1 | git switch --detach <commit-hash> |
4. 回退合并提交
如果你想回退一次合并,可以使用以下命令:
1 | git revert -m 1 <merge-commit-hash> |
其中,-m 1
参数指定了哪个父提交应该保存,通常是1。
结合实际示例
假设你有以下提交历史:
1 | commit abcdef1 (HEAD -> main) |
回退到 abcdef3
:
- 使用
reset --hard
:
1 | git reset --hard abcdef3 |
- 使用
revert
:
1 | git revert abcdef1 |
切换到 abcdef2
(分离头指针状态):
1 | git checkout abcdef2 |
或者:
1 | git switch --detach abcdef2 |
返回到主分支(从分离头指针状态返回):
1 | git switch main |
总结
选择哪种方法取决于你具体的需求:
git reset
用于彻底回退,尤其是本地仓库。git revert
在协作环境中更安全,因为它通过创建新的提交来实现回退。git checkout
和git switch
用于直接切换到指定的提交或分支。
记住,操作前一定要确保已经了解这些命令的作用,尤其是在牵涉到删除历史记录或变更的情况下。
五.git 如何撤销工作区修改,撤销暂存区修改,撤销提交
在 Git 中,可以使用不同的命令来撤销工作区修改、撤销暂存区修改以及撤销提交。下面分别介绍这三种情况下的撤销操作:
1. 撤销工作区修改
如果你对某个文件做出了修改,但想要撤销这些修改,可以使用以下命令:
1 | git checkout -- <file> |
这条命令会从最近的提交中恢复 <file>
文件,覆盖掉工作区的更改。
2. 撤销暂存区修改
如果你已经将文件添加到暂存区(使用 git add
),但后悔了想要撤销对暂存区的修改,可以使用以下命令:
1 | git reset HEAD <file> |
这个命令会将暂存区中 <file>
的修改撤回到工作区,但会保留在工作区中的更改。
3. 撤销提交
如果你已经提交了一个或多个提交,想要撤销最近的提交,可以使用以下命令:
撤销最近一次提交(在不改变工作区内容的情况下)
1 | git reset --soft HEAD^ |
这个命令会将 HEAD 指向的提交撤销,并且保留工作区和暂存区中的更改。你可以根据需要修改文件然后重新提交。
撤销最近一次提交以及更改(回退工作目录中的文件内容,同时保留这些修改到暂存区)
1 | git reset --mixed HEAD^ |
此命令将 HEAD 指向的提交撤销,并且将修改放回到工作目录,但不会删除它们。你可以重新使用 git add
将需要提交的更改加入暂存区。
撤销提交并删除工作目录中的更改
1 | git reset --hard HEAD^ |
这会将 HEAD 指向的提交撤销,同时从工作目录中彻底删除这些更改。
撤销多个提交
如果需要撤销多个提交,可以将 HEAD~N
替换为你想要撤销的提交数量,例如撤销最近三次提交:
1 | git reset --soft HEAD~3 |
请注意,撤销提交会改变仓库历史,确保你真正需要这样做。
注意事项
- 在任何情况下,使用这些命令前请确保明白其影响。
- 如果你与他人共享仓库,则应慎重使用撤销提交的命令,避免干扰其他开发者的工作。
- 当操作不确定时,可以使用
git status
来查看当前的状态,并确保你理解要执行的操作的影响。
以上是在 Git 中撤销工作区修改、撤销暂存区修改以及撤销提交的常见操作。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2024/05/20/多人协作-Git管理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!