Git入门级指南

在软件开发和版本控制中,Git是一种非常流行且强大的工具。本文将为你提供关于Git的基本知识,并提

供一些实例来演示如何正确使用Git来管理代码。

关于git的简介

Git是一种分布式版本控制系统,它可以跟踪和管理项目中的代码变更。与其他版本控制系统不同,Git具

有强大的分支和合并功能,使得多人协作和并行开发更加容易。Git还具备高效的性能和出色的安全性,被

广泛应用于各种规模的项目中。

安装

在官网安装对应的版本即可:https://git-scm.com/downloads

安装:无脑下一步即可,安装完毕即可使用了!

Git入门级指南-LMLPHP

Git入门级指南-LMLPHP

git的基本概念

  1. 仓库(Repository)是存储代码的地方。在本地计算机上创建仓库,或利用代码托管平台(如GitHub或GitLab)上的远程仓库。
  2. 提交(Commit)是对代码的快照。每次提交都会记录代码的修改,并为其提供一个唯一的标识符。
  3. 分支(Branch)是在仓库中并行开发的不同版本。通过创建和切换分支,可以同时进行多个任务和实验。
  4. 合并(Merge)将一个分支的修改合并到另一个分支。这是多人协作和集成工作的关键步骤。
  • 工作区:仓库的目录。工作区是独立于各个分支的。
  • 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
  • 版本库:存放所有已经提交到本地仓库的代码版本
  • 版本结构:树结构,树中每个节点代表一个代码版本。

git的常用命令

全局设置

git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中

常用命令

git add XX :将XX文件添加到暂存区
git commit -m "给自己看的备注信息":将暂存区的内容提交到当前分支
git status:查看仓库状态
git log:查看当前分支的所有版本
git push -u (第一次需要-u以后不需要) :将当前分支推送到远程仓库
git clone git@github.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
git branch:查看所有分支和当前所处分支

查看命令

git diff XX:查看XX文件相对于暂存区修改了哪些内容
git status:查看仓库状态
git log:查看当前分支的所有版本
git log --pretty=oneline:用一行来显示
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
git branch:查看所有分支和当前所处分支
git pull :将远程仓库的当前分支与本地仓库的当前分支合并

删除命令

git rm --cached XX:将文件从仓库索引目录中删掉,不希望管理这个文件
git restore --staged xx:==将xx从暂存区里移除==
git checkout — XX或git restore XX:==将XX文件尚未加入暂存区的修改全部撤销==

代码回滚

git reset --hard HEAD^ 或git reset --hard HEAD~ :将代码库回滚到上一个版本
git reset --hard HEAD^^:往上回滚两次,以此类推
git reset --hard HEAD~100:往上回滚100个版本
git reset --hard 版本号:回滚到某一特定版本

远程仓库

git remote add origin git@github.com:xxx/XXX.git:将本地仓库关联到远程仓库
git push -u (第一次需要-u以后不需要) :将当前分支推送到远程仓库
git push origin branch_name:将本地的某个分支推送到远程仓库
git clone git@github.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
git push -d origin branch_name:删除远程仓库的branch_name分支
git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地
git pull :将远程仓库的当前分支与本地仓库的当前分支合并
git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应

分支命令

git branch branch_name:创建新分支
git branch:查看所有分支和当前所处分支
git checkout -b branch_name:创建并切换到branch_name这个分支
git checkout branch_name:切换到branch_name这个分支
git merge branch_name:将分支branch_name合并到当前分支上
git branch -d branch_name:删除本地仓库的branch_name分支
git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
git push -d origin branch_name:删除远程仓库的branch_name分支
git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地
git pull :将远程仓库的当前分支与本地仓库的当前分支合并
git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应

stash暂存


git stash:将工作区和暂存区中尚未提交的修改存入栈中
git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop:删除栈顶存储的修改
git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
git stash list:查看栈中所有元素

git config --global [user.name](http://user.name) xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email [xxx@xxx.com](mailto:xxx@xxx.com):设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中

常用的操作步骤

在我们完成一个项目的时候,往往需要把代码上传到如GitHub等代码托管平台,除了备份代码方便回滚意外,也方便同组的其他伙伴更新代码,那么我们会常常用到以下命令以及操作步骤:

  1. 创建仓库和提交:
    • 在本地计算机上,使用命令git init创建一个新的Git仓库。
    • 使用git add命令添加要提交的文件。
    • 使用git commit -m "commit message"将更改提交到仓库。
  2. 分支创建和切换:
    • 使用git branch branch_name命令创建一个新的分支。
    • 使用git checkout branch_name命令切换到指定的分支。
  3. 修改代码和提交:
    • 在分支上进行代码修改。
    • 使用git status命令查看修改的文件。
    • 使用git push命令将修改提交到仓库。
  4. 合并分支:
    • 切换到接收更改的分支。
    • 运行git merge branch_to_merge命令将指定分支的修改合并到当前分支。
    • 解决合并冲突(如果有)。
    • 使用git commit命令提交合并后的代码。

重要概念解析

系统架构图

先看一张git操作的结构图

Git入门级指南-LMLPHP

测试连通性:ssh -T git@github.com

生成ssh:ssh-keygen -t rsa -C 邮箱

分支

分支操作

查看分支:git branch(git branch -v)
创建分支:git branch 分支名
切换分支:git checkout 分支名
创建分支并切换:git checkout -b 分支名
合并分支:git merge 分支名
删除分支:git branch -d 分支名(不能删除当前所在分支,需要切换到另一个分支才能删除)
强行删除分支:git branch -D 分支名
细节:
    1.如果在分支A中进行了写操作(增删改),但此操作局限在工作区中进行(没有add和commit),在master中能够看到该操作。
    如果在分支A中进行了写操作,并且commit到了对象区,则master中无法观察到此文件
    2.如果在分支A中进行了写操作,但此操作局限在工作区中进行,则删除分支不需要合并


分支合并

分支名:指向当前的提交(commit)
HEAD:指向当前分支(HEAD->分支名)

如果一个分支靠前(new),一个分支落后(master),则如果不冲突,master可以通过merge直接追赶上new,称为fast forward。
fast forward本质上就是分支指针的移动:
    1.两个分支fast forward归于一点commit
    2.丢失分支信息(git log --graph看不见两个分支的路径,因为被合并了)
git merge默认使用fast forward,但我们可以手动禁止:git merge --no-ff 分支名
    1.两个分支不会归于一个commit,主动合并的分支,会前进一步
    2.分支信息不会丢失(git log --graph)


冲突

冲突:如果两个分支在同一个时刻,且两个分支同时修改了同一个文件的同一行,在合并时会引起冲突
如何解决冲突?(拿master和new分支举例)
    1.先在某个分支(例如master)中打开这个文件,把内容修改为最终需要的内容
    2.git add 文件名(这里的add并不是从工作区到暂存区,而是告诉git冲突已经解决)
    3.git commit -m "文件注释"
解决冲突会造成两次提交,即sha1值会出现两个:1次是最终提交,1次是将对方分支(new)的提交信息获取过来
这时候观察文件内容,master中的文件内容是最终修改后的内容,而new中的文件内容是解决冲突前的内容
这时候直接把new分支合并到master分支即可
这时候可能有人会问了,同样修改了同一行为什么最后这次合并不要解决冲突呢?
这其实是因为master分支的最终提交和new在解决冲突之前的提交不处于同一时刻,所以直接合并即可
简而言之:如果一方落后,则落后方可以直接通过merge合并到处于前面的分支


07-01 09:53