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 |
|
1 |
|
关于远程仓库的解释下面会讲到
1 |
|
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 |
|
文件状态:
- 没有被add过的文件叫untracked
- add之后文件处于staged状态,等待commit
- commit之后文件处于unmodified,如果是modified是因为文件会跟仓库中的文件对比
- 当unmodified的文件被修改则会变为modified状态
- modified之后的文件add之后将继续变为staged状态
- unmodifed的文件还有一种可能是已经不再需要了,那么可以remove它不再追踪变为untracked状态
3.分支命令
在初始化仓库时默认分支为master(主分支),前面在切换版本时需要不停的reset,我们可以通过分支来解决频繁的操作,Git 鼓励在工作流程中频繁使用分支与合并
在开发过程中,一般不对master进行修改,而是不同的部门、功能小组划分不同的分支进行开发,没有问题了合并到 master 分支发布。
1 |
|
4.远程操作
绑定仓库
1 |
|
生成SSH key
1 |
|
然后连续3次回车,会在用户目录下生成一个文件,找到.ssh\id_rsa.pub
文件,打开并复制里面的内容,打开你的github主页,进入个人设置 -> SSH and GPG keys -> New SSH key:
将刚复制的内容粘贴到key那里,title随便填,保存
测试是否成功
1 |
|
提交
1 |
|
下载
1 |
|
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 |
|
1 |
|
1 |
|
3.删除分支
1 |
|
1 |
|
4.git多人操作同一分支
不同人修改了不同文件
首先使用
fetch
命令将远端仓库的变更拉取下来,再使用merge
合并当前分支和远端分支,然后向远端进行push
1 |
|
不同人修改了相同文件的不同区域
和第一步相同,因为在git中修改的是文件的不同位置,git可以智能的帮我们进行commit
不同人修改了相同文件的相同区域
不同人修改了同一文件的相同区域时,后push到远端的人在push时会报错,需要我们pull拉取到最新的
使用git pull拉取远端的最新内容时,git会提醒需要解决冲突,需要手动解决,解决冲突后重新commit后push即可。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!