GIScoding

虎皮猫咖

Git 快速上手实践

5
2025-04-10

一张图总结:
image.png

本地项目推送远程仓库流程

1. 远程仓库新建仓库

登录 Github 远程托管中心 Web 平台,由项目组管理人员新建远程库(一个远程库对应一个本地. git 项目)。然后在仓库设置中,配置开发协作者信息与权限:

  • 公开仓库: 对所有人可见,即所有人都可以 Clone,但只有有权限的协作者可以 Pull/Push
  • 私有仓库: 非项目组开发人员不可见(非开源),只有有权限的协作者可以 Clone/Pull/Push

在 GitHub 上创建新仓库时,不要直接添加 README 或其他文件

image.png

远程仓库名称 origin:当你使用 git remote add origin 命令时,origin 是指你为远程仓库指定的名称,而不是分支名称。origin 是一个约定俗成的名称,用于标识远程仓库的 URL。例如:

git remote add origin https://github.com/username/repo.git

这里的 origin 只是一个别名,指向远程仓库的 URL。

2. 本地仓库操作

当你第一次在本地使用 Git 进行代码提交时,Git 需要知道是谁在提交代码。配置用户信息后,每次提交都会自动附带这些信息。因此,当其他开发者查看 Git 历史记录时,他们可以看到是谁做了哪些更改,这在多人协作项目中尤为重要。

git config --global user.name "Your Name"
git config --global user.email "[email protected]"
  • 设置全局用户名 (user.name),这个用户名将显示在每次的提交记录中,与邮箱一起标识每次提交的作者身份。

  • 设置全局用户邮箱 (user.email),每次你在本地进行提交时,这个邮箱将会作为提交记录的一部分,显示在提交历史中,便于追踪和识别作者。

步骤一:配置完信息后,在项目目录里面执行:

git init 

该指令会在本地新建一个 Git 仓库,并默认创建名为 master 的分支。此名称是 Git 的默认行为,从 Git 诞生以来一直如此。

近年来,Git 社区和许多技术公司(包括 GitHub)开始采用更具包容性的语言,并逐渐将默认分支名称从 master 改为 main

步骤二:在本地项目目录中使用 git remote 命令将项目关联到远程仓库,项目地址参考上文中github给出的地址:
image.png

git remote add origin <远程仓库的URL>
git remote -v #显示所有本地库关联的远程仓库信息(别名-url-operation)

# demo:https
git remote add origin https://github.com/your-username/repository-name.git

# demo:ssh (需要将宿主机的SSH公钥放置在Github上)
git remote add origin [email protected]:your-username/repository-name.git
# 将当前所在的分支强制重命名为 `main`
git branch -M main

# 或者下列操作
git branch -m master main

使用场景

  • 当你不知道当前分支的具体名称(或者不关心它是什么),只是想将其命名为 main 时使用。
  • -M 是 --move --force 的缩写,表示强制重命名,即使目标分支名 main 已经存在也会覆盖。

image.png

步骤三:重命名分支后,更新远程仓库的默认分支(例如在 GitHub 上设置 main 为默认分支),并推送更改

git push -u origin main
  • -u(或 --set-upstream):这个选项将本地分支与远程分支关联起来,并将该分支设置为“上游”分支(upstream branch)。这样,你可以以后只使用 git pushgit pull,而不需要每次都指定远程分支(例如 origin main)。

  • origin:表示远程仓库的名称,通常默认为 origin,指向你克隆仓库时的默认远程源。

  • main:这是你要推送的本地分支名称。在许多 Git 仓库中,默认的主分支名称为 main,但某些仓库可能使用 master 作为主分支。

image.png

如果远程仓库存在一些文件,需要先拉取 (pull) 这些文件到本地,后推送 (push) 至远程项目。

拉取远程仓库的变化到本地:

git pull origin main

这会将远程仓库的 main 分支的内容拉取到你本地的仓库中。

如果拉取过程中有冲突(conflicts),你需要解决这些冲突。Git 会在冲突的文件中标记出冲突的地方,你需要手动修改这些文件并解决冲突。

# 强制合并不相关的历史
git pull origin main --allow-unrelated-histories

常用 GIT操作

基础操作

初始化仓库:在项目目录中打开终端,运行以下命令来初始化 Git 仓库:

git init

如果想要将本地项目推送至远程 GitHub 仓库,

克隆仓库:从远程服务器(如 GitHub)克隆现有的 Git 仓库:

git clone <仓库URL>

git clone -b <分支名称> <仓库URL>

添加文件:添加所有文件到暂存区:

git add .
git add [file1] [file2] ... #指定暂存多个文件
git add [dir] #指定暂存某目录
git add . #指定暂存当前目录下的所有文件

这将把所有文件添加到 Git 的暂存区。

提交到本地仓库

git commit -m [message]  #生成当前所有暂存区快照,附加提交说明信息 message
git commit [fileName1] [fileName2] ... -m [message]  #提交暂存区的指定文件到本地库

# 提交已被跟踪的文件(modified、deleted)直接更新到本地库
# 自动执行暂存命令(帮你省去了add步骤),但是新添加的文件(untacked)不受影响。
git commit -a -m [message] 

将本地的分支推送到远程仓库

# 将本地的 `main` 分支推送到远程仓库 `origin` 分支。
git push -u origin main

查看状态:查看工作目录和暂存区的状态,它会列出所有被修改、已添加到暂存区或未跟踪的文件。

git status

查看提交历史:查看仓库的提交历史记录:

git log

分支操作

  1. 创建分支:创建一个新的分支来处理一个功能或修复:
git branch	#列出所有本地分支(带*为主分支)

git branch [branch-name]	#新建一个分支,但依然停留在当前分支

git branch -v #查看当前分支的最新提交信息。包含 commit对象哈希,提交提示信息message
  1. 切换分支:切换到不同的分支:
# git checkout 切换分支
# 切换到指定分支(最新commit),并用该分支的最后提交的快照替换你的当前工作目录的内容
git checkout [branch-name]
# 创建新分支并立即切换到该分支下
git checkout -b [branchname] 

# git switch 切换分支
git switch [branch-name] #切换分支
git switch -c [branchname] #创建新分支并立即切换到该分支下

Git 在 2.23 版本中,引入了两个新命令 git switchgit restore,用以替代现在 git checkout 的分支切换和工作区恢复的职责。

  1. 合并分支:将一个分支的更改合并到另一个分支:
git merge <分支名>

# 对Develop分支进行合并   
git merge --no-ff develop

这里稍微解释一下上一条命令的--no-ff参数是什么意思。默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。
使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。

image.png
image.png
  1. 推送更改:将本地仓库中的提交推送到远程仓库:
git push <远程名> <分支名>
  1. 拉取更改:从远程仓库获取更改并将它们合并到当前分支:
git pull <远程名> <分支名>
  1. 储藏更改:暂时存储尚未准备提交的更改:
git stash
  1. 撤销更改:将工作目录中的更改恢复到以前的提交状态:
git checkout -- <文件>

或者,要撤销到特定的提交:

git revert <提交ID>

git reset --soft HEAD~1 # 这会保留更改在工作目录中

git reset --hard HEAD~1 # 完全丢弃更改

git reset的三种模式(--soft, --mixed, --hard)有什么区别?

  • --soft:仅移动HEAD指针,不修改暂存区和工作目录
  • --mixed(默认):移动HEAD指针并重置暂存区,但不修改工作目录
  • --hard:移动 HEAD 指针、重置暂存区(Index)和工作目录(Working Directory),完全丢弃所有未提交的更改(包括已暂存和未暂存的修改)。
  1. 合并分支操作

git rebase :将当前分支的提交历史“重放”到目标分支的最新提交之上,从而创建一条线性提交历史。

git merge:将分支合并到主分支,主分支上有有单独合并节点

squash commit: 将多个提交合并为单个提交,从而简化提交历史。

image-20250324125643824

视频链接 (https://www.youtube.com/watch?v=0chZFIZLR_0&t=14s)

分支存在冲突解决办法

git push 命令的本质是推送本地最新的 commit 对象版本到远程库延顺更新版本,这就要求本地库的基础版本与远程库目前版本一致。

但在多人协作开发时,经常出现远程分支上存在本地分支中不存在的提交记录(其他人先一步推送了它的版本,导致本地版本与目前的远程版本有差异),此时就出现了 PUSH 冲突而导致报错。

  • 强制覆盖:git push -f <远程主机名> <本地分支名> 强制覆盖远程仓库

  • 无需手动解决的冲突: 在 push 之前,已经有开发人员先一步 push 的新的版本,但新版本与本地修改的文件或位置不同。本地 push 时会提示 push 失败(存在版本冲突)。解决方法为先 pull 拉取最新代码,再 push 推送即可。

  • 需手动解决的冲突: 在 push 之前,已经有开发人员先一步 push 的新的版本,但新版本与本地修改的文件或位置存在重叠。地 push 时会提示 push 失败(存在版本冲突)。解决方法为先 pull 拉取最新代码,这时存在 pull 合并冲突问题,需手动修改冲突内容,然后使用 add+commit 标记,再 push 推送即可。