Git 快速上手实践
编辑一张图总结:
本地项目推送远程仓库流程
1. 远程仓库新建仓库
登录 Github 远程托管中心 Web 平台,由项目组管理人员新建远程库(一个远程库对应一个本地. git 项目)。然后在仓库设置中,配置开发协作者信息与权限:
- 公开仓库: 对所有人可见,即所有人都可以 Clone,但只有有权限的协作者可以
Pull/Push
- 私有仓库: 非项目组开发人员不可见(非开源),只有有权限的协作者可以
Clone/Pull/Push
在 GitHub 上创建新仓库时,不要直接添加 README 或其他文件。
远程仓库名称
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给出的地址:
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
已经存在也会覆盖。
步骤三:重命名分支后,更新远程仓库的默认分支(例如在 GitHub 上设置 main 为默认分支),并推送更改
git push -u origin main
-
-u
(或--set-upstream
):这个选项将本地分支与远程分支关联起来,并将该分支设置为“上游”分支(upstream branch)。这样,你可以以后只使用git push
或git pull
,而不需要每次都指定远程分支(例如origin main
)。 -
origin
:表示远程仓库的名称,通常默认为origin
,指向你克隆仓库时的默认远程源。 -
main
:这是你要推送的本地分支名称。在许多 Git 仓库中,默认的主分支名称为main
,但某些仓库可能使用master
作为主分支。
如果远程仓库存在一些文件,需要先拉取 (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
分支操作
- 创建分支:创建一个新的分支来处理一个功能或修复:
git branch #列出所有本地分支(带*为主分支)
git branch [branch-name] #新建一个分支,但依然停留在当前分支
git branch -v #查看当前分支的最新提交信息。包含 commit对象哈希,提交提示信息message
- 切换分支:切换到不同的分支:
# 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 switch
和git restore
,用以替代现在git checkout
的分支切换和工作区恢复的职责。
- 合并分支:将一个分支的更改合并到另一个分支:
git merge <分支名>
# 对Develop分支进行合并
git merge --no-ff develop
这里稍微解释一下上一条命令的--no-ff
参数是什么意思。默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将Master分支指向Develop分支。
使用--no-ff
参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。
![]() | ![]() |
- 推送更改:将本地仓库中的提交推送到远程仓库:
git push <远程名> <分支名>
- 拉取更改:从远程仓库获取更改并将它们合并到当前分支:
git pull <远程名> <分支名>
- 储藏更改:暂时存储尚未准备提交的更改:
git stash
- 撤销更改:将工作目录中的更改恢复到以前的提交状态:
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),完全丢弃所有未提交的更改(包括已暂存和未暂存的修改)。
- 合并分支操作
git rebase
:将当前分支的提交历史“重放”到目标分支的最新提交之上,从而创建一条线性提交历史。
git merge
:将分支合并到主分支,主分支上有有单独合并节点
squash commit
: 将多个提交合并为单个提交,从而简化提交历史。
视频链接 (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 推送即可。
- 0
- 0
-
分享