git使用

一、Git介绍

1.什么是Git?

git为一个分布式的版本控制软件,由林纳斯创作,最初是用于更好地管理Linux内核的开发,因为提交Linux功能的人太多了,最终都需要手动进行合并代码

分布式在于每个人都可以拷贝完整的项目到本地进行开发

版本控制:Git会保留每次提交时的commitID,这样可以回滚到之前的版本

使用Git,不但能自动记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要瞄一眼就可以

2.名词介绍

工作区:就是工作的区域,写代码的地方,在文件夹中使用git init命令后,该文件夹变为工作区,我们所有的操作都是在该文件夹中进行

暂存区:使用git add <文件名>可以将文件放到暂存区,是我们把文件进行提交前的一个过渡阶段,临时存储。所有暂存的文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”

本地仓库:使用git commit会将暂存区内容提交到本地仓库中,如果我们在commit后再次修改文件,则需要再次git add

远程仓库:和本地仓库一样,但是位于远端(服务器),在团队开发中我们需要一个远程仓库进行提交(push)、下载(pull)我们的项目,用于团队协作开发

远程仓库副本:可以理解为存在于本地的远程仓库缓存。如需更新,可通过git fetch/pull命令获取远程仓库内容。使用fech获取时,并未合并到本地仓库,此时可使用git merge实现远程仓库副本与本地仓库的合并

当我们提交项目时会经过暂存(git add *)->提交(git commit)->上传远端(git push)

3.Git仓库组成

使用git init命令后生成.git隐藏文件夹,该文件夹中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。

config文件:用于配置本地仓库的一些信息,仓库名、当前分支、绑定的远程仓库地址

Index(索引):进行过提交的操作后会有该文件。将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为索引

二、命令

1.基本命令

命令的操作都是在工作区下进行

git中可以使用Linux命令

git中的复制粘贴可以选中要复制的内容,按鼠标中键

设置签名

配置完成后可以在C:\Users\${用户名}\.gitconfig中看到

1
2
git config --global user.email "1351740185@qq.com"
git config --global user.name "lingdiand"
1
2
3
4
git init	#将项目交给git管理,在项目根目录下出现.git文件夹
git add * #将所有未被git管理的文件纳入到git的管理中,可以理解为该文件被git所跟踪
git status #查看当前文件的状态(有哪些文件更改了没有提交)
git commit -m '提交了XXX' #将代码提交到本地仓库,-m 提交注释,可以说明自己这次提交做了些什么

关于远程仓库的解释下面会讲到

1
2
3
4
5
git remote add origin https://gitee.com/group-8-dian/hsp.git	 #将本地仓库与远程仓库绑定
git remote show origin #显示远程库origin里的资源
git push origin master #将本地仓库推送到远程仓库
git pull origin master #下载远程仓库的项目(团队开发要先下载再上传)
git fetch origin master

origin为远程仓库名,master为分支名

pull=fetch+merge git fetch并没有更改本地仓库的代码,只是拉取了远程仓库的commitID

2.状态查看

reset一共有三种模式

  • –hard:不保留所有变更,所有的一切都会还原到哈希值对应项目的状态
  • –soft:保留变更且变更内容处于Staged
  • –mixed:保留变更且变更内容处于Modified

log和reflog中显示的哈希值其实是一样的,通过reset可以回退版本

在 Git 中,用 HEAD 表示当前版本,也就是最新的提交 commit id,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个 ^ 比较容易数不过来,所以写成 HEAD~100

1
2
3
4
git log			#查看日志信息
git reflog #查看所有操作记录
git reset --hard 版本号 #回滚,版本号为日志中的哈希值
git reset --hard HEAD^ #回退上一个版本

文件状态:

  1. 没有被add过的文件叫untracked
  2. add之后文件处于staged状态,等待commit
  3. commit之后文件处于unmodified,如果是modified是因为文件会跟仓库中的文件对比
  4. 当unmodified的文件被修改则会变为modified状态
  5. modified之后的文件add之后将继续变为staged状态
  6. unmodifed的文件还有一种可能是已经不再需要了,那么可以remove它不再追踪变为untracked状态

3.分支命令

在初始化仓库时默认分支为master(主分支),前面在切换版本时需要不停的reset,我们可以通过分支来解决频繁的操作,Git 鼓励在工作流程中频繁使用分支与合并

在开发过程中,一般不对master进行修改,而是不同的部门、功能小组划分不同的分支进行开发,没有问题了合并到 master 分支发布。

1
2
3
4
5
6
git branch <branchName>		   #只是新建了一条分支,并未切换
git checkout -b <branchName> #创建并切换分支
git branch -d <branchName> #删除分支
git checkout master #切换主分支
git branch #查看所有分支
git merge <branchName> #合并分支

4.远程操作

绑定仓库

1
git remote add origin https://gitee.com/group-8-dian/hsp.git	 #将本地仓库与远程仓库绑定

生成SSH key

1
ssh-keygen -t rsa -C "邮件地址"

然后连续3次回车,会在用户目录下生成一个文件,找到.ssh\id_rsa.pub文件,打开并复制里面的内容,打开你的github主页,进入个人设置 -> SSH and GPG keys -> New SSH key:

将刚复制的内容粘贴到key那里,title随便填,保存

测试是否成功

1
$ ssh -T git@github.com # 注意邮箱地址不用改

提交

1
git push origin master  	#将本地仓库推送到远程仓库

下载

1
git pull origin master		#下载远程仓库的项目(团队开发要先下载再上传)

pull远程仓库后,本地再新建一个分支需要设置上流分支才可以push

而从远程分支 checkout 出来的本地分支,即checkout分支本身来自远程仓库,称为跟踪分支(tracking branch)。跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入git push,Git会自行推断应该向哪个服务器的哪个分支推送数据。反过来,在这些分支里运行git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来

在克隆仓库时,Git 通常会自动创建一个名为 master 的分支来跟踪 origin/master。这正是 git push 和 git pull 一开始就能正常工作的原因。当然,你可以随心所欲地设定为其它跟踪分支,比如 origin 上除了 master 之外的其它分支

三、其他

1.git fetch和git pull区别

pull=fetch+merge git fetch并没有更改本地仓库的代码,只是拉取了远程仓库的commitID

git fetch
比如本地仓库的节点为1->2,此时head指针指向2。远程仓库为1->2->3->4,git fetch后本地仓库变为1->2->3->4,本地仓库的12加上远程仓库的34,但是head指针还是指向2,并没有进行合并

git pull

最上面的节点合并了箭头两个节点的内容

可以看到,Git中最重要的是commitID,我们需要通过它进行各种操作,通过head指针指向某一个commitID

Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针,是commit序列的集合载体

https://www.bilibili.com/video/BV1BE411g7SV

https://blog.csdn.net/halaoda/article/details/78661334

2.git创建分支并推送到远程

1
git checkout -b dev  	#本地创建dev分支
1
git push origin dev:dev	#将dev分支推送至远端。冒号前的dev指本地dev,冒号后的dev指远端的,没有会自动创建
1
git branch --set-upstream-to=origin/dev  #建立与远端的链接,这样代码才能提交上去

3.删除分支

1
git branch -d dev	#删除本地分支
1
2
git push origin :dev #在origin repository里面查找dev。用一个空的去更新它,就相当于删除了
git push origin --delete dev

4.git多人操作同一分支

  • 不同人修改了不同文件

    首先使用fetch命令将远端仓库的变更拉取下来,再使用merge合并当前分支和远端分支,然后向远端进行push

1
2
3
git fetch origin dev //拉取
git merge dev dev //本地合并
git push origin dev //推送
  • 不同人修改了相同文件的不同区域

    和第一步相同,因为在git中修改的是文件的不同位置,git可以智能的帮我们进行commit

  • 不同人修改了相同文件的相同区域

    不同人修改了同一文件的相同区域时,后push到远端的人在push时会报错,需要我们pull拉取到最新的

    使用git pull拉取远端的最新内容时,git会提醒需要解决冲突,需要手动解决,解决冲突后重新commit后push即可。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!