简介
git就是一个很方便管理各种代码版本的一个工具,它是用一个树结构,来管理我们所有的历史版本,就是从一个最原始的起点开始,然后每一个节点都代表一个代码的版本,然后每一个节点都可以同时扩展很多个分支,我们也可以快速实现不同分支之间相互合并的操作,同时我们也可以很容易得实现回滚操作。比如我们想把我们的代码恢复到某一个历史版本,某一个节点,我们就可以用一个命令直接恢复到那个节点。
所以git就相当于是将代码非常多的历史版本,用一棵树得形式维护出来,每一次修改都会在当前的节点之下去创建一个新的节点,它会把所有的历史记录都存下来,而且支持多分枝,多分枝的话,大家就可以相互之间协同合作了,我们自己开发项目的时候,一般一两个分支就够了,主要用来回顾历史版本。
比如过了一年之后,不太清楚当初的写作历程是什么了,这时候就可以回顾一下,然后一个命令回滚到历史版本。 如果是多个人合作的话,可以利用云平台,多个人合作需要一个云平台同步代码,大家可以将一个git的仓库(一个版本控制的仓库)放到云端,然后每个同学每次修改的时候,从云端把最新的项目拉下来,然后每次开个分支来写,然后写完之后再合并到一起。
所以git最主要的就是一个版本管理的工具,而且是可持久化的,支持多人合作。
git基本概念
从本地看git的时候,其实就是一个文件夹,工作区就是这个文件夹,也就是当前的工作目录,而且工作区是和分支是独立的,也就是不管是在哪个分支里面,工作区都是同一个 工作区:仓库的目录。工作区是独立于各个分支的。
暂存区:就是暂存区和工作库之间的桥梁,数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。我们要每一次将工作区存入到我们的版本库里,存成某一个节点,我们存的时候不会直接存,会先放到暂存区里,每次往暂存区里放一点,然后最后要存的时候,是将暂存区整体放到版本库里
版本结构就是一个树的结构,每个点代表一个历史版本,是一个从根节点开始的有向树,这个树里还有一个指针的概念,就是HEAD,可以认为是头指针,这个指针每次都只会位于其中一个节点
举个例子: 如何将一个新的版本放到历史库里面:
在工作区来写,写一点放一点,然后将我们当前版本里面所有的文件放到暂存区之后,然后每次我们要将当前工作区存到版本库里的时候,在HEAD 节点后面创建一个新的节点,然后将暂存区里的所有内容放到我们新的节点里面,同时将我们的HEAD,往后移一位
版本库:将所有的版本用一颗树存下来,这就是版本库。存放所有已经提交到本地仓库的代码版本 版本结构:树结构,树中每个节点代表一个代码版本。
常用命令
本地
先设置自己的名字和邮箱
git config --global user.name xxx
设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com
设置全局邮箱地址,信息记录在~/.gitconfig文件中
创建git
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
添加到缓存区
git add XX:将XX文件添加到暂存区 git add .:将所有待加入暂存区的文件加入暂存区
git add 感觉可以理解为将操作存下来 这里的git add 并不一定增加或者修改了文件,也可以是删除了文件,就比如 这样就是把
删除文件
git并不一定非要管理文件夹里的文件
git rm --cached XX:将文件从仓库索引目录中删掉 ,不去管理XX文件,不希望管理某个我文件的话,可以把它从管理的文件列表中删除出来 想要加回去的话,就要用git status
git restore --stage XX:这个是还要管理这个文件,只是将文件从暂存区拿出来
持久化
git commit -m “给自己看的备注信息”:将暂存区的内容提交到当前分支(这个节点的名字就是你自己备注的信息)这一步也被成为持久化
这里是把缓存区持久化,如果文件修改了但是没有放到缓存区也不会被持久化
查看仓库状态
git status:查看仓库状态
查看文件和暂存区的不同
git diff XX:查看XX文件相对于暂存区修改了哪些内容
查看历史版本
git log:查看当前分支的所有版本 这个就是从根节点一直到当前节点的路径,但是这个输出的是很多行,从下到上,就是根节点到现在的节点的顺序 如果感觉输出比较乱的话,可以用
git log --pretty=oneline
这个就是每一个输出在一行了
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
向前回滚
最后加上一个~或者是^,都一样,加一个代表向前回滚一个单位,两个代表回滚俩个单位
git reset --hard HEAD^ 或 git reset --hard HEAD~:将代码库回滚到上一个版本 git reset --hard HEAD^^:往上回滚两次,以此类推 git reset --hard HEAD~100:往上回滚100个版本 以上回滚是不会把内容删掉的
查看所有的移动记录
git reflog 可以看head的移动记录包括回滚, 然后找到节点的编号,编号其实就是哈希值的前七位
回滚到某一特定版本
git reset --hard 版本号:回滚到某一特定版本
撤销修改
git checkout — XX或git restore XX:将XX文件尚未加入暂存区的修改全部撤销,然后工作区相对于暂存区的修改就删掉了。如果暂存区没有存东西,就变成头节点指的那个文件的内容
如果暂存区也不想用了,stage就是暂存区 git restore --staged + 文件名 将文件从暂存区删出来 git restore + 文件名
这样做其实就相当于,暂存区和工作区都清空了,回到了上一个版本
撤销也并不一定只能撤销增加的,也可以撤销被删除的文件,比如一个文件被持久化了,然后被删除掉了,这个时候你可以选择将删除了这个文件的操作放入到缓存区,也可以不放,如果没有放到缓存区的话,就可以对这个文件进行回滚,也就是可以通过git restore XX将文件进行恢复,再次放入仓库。如果这个文件在缓存区,就需要先进行 git restore --staged XX,将文件从缓存区拿出来
主分支就叫master分支
删除本地仓库
就直接删除文件夹就可以 rm project -rf
云端
在将本地文件传到云端的时候,一定要注意,文件名要一样
分支
默认创建的都是主分支
云端一般叫origin,本都不需要加描述
传到云端
git remote add origin git@git.acwing.com:xxx/XXX.git:将本地仓库关联到远程仓库
从云端复制下来
git clone git@git.acwing.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
只能把分支复制下来,引用记录没有啦,git reflog为空了 但是 git log 是有的
删除云端仓库
设置 —— 高级—— 删除项目
多分枝
开发的时候,一般不会在主分支上开发,会开辟一个新的分支
创建一个分支
git checkout -b branch_name:创建并切换到branch_name这个分支
并不会立即创建新的节点,所以当前的文件内容,跟它上一个的内容是一样的,缓存区只有一个,不会因为切换分支而改变
查看分支
git branch:查看所有分支和当前所处分支
切换分支
git checkout branch_name:切换到branch_name这个分支
合并分支
git merge branch_name:将分支branch_name合并到当前分支上 这个命令其实就是改变了head指示的节点,如果想让它强行复制一遍的话可以自己搜一下,好像是加上-noff
删除分支
git branch -d branch_name:删除本地仓库的branch_name分支 合并完之后可以删除掉分支
上传至云端
git push -u (第一次需要-u以后不需要):将当前分支推送到远程仓库 git push origin branch_name:将本地的某个分支推送到远程仓库
创建分支
git branch branch_name:创建新分支
下面这个加了一些参数,就是,如果云端没有这个分支,就创建这个分支 git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
删除其他分支的时候,要先换到别的分支,如果已经上传到了云端,其实本地和云端是独立的
删除云端分支
git push -d origin branch_name:删除远程仓库的branch_name分支
就是把云端的分支与本地关联(把云端装到本地)
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程branch_name1分支与本地的branch_name2分支对应(可以看作,如果本地没有这个分支,就创建一个,但是并不会更新内容)
如果要更新内容的话,要以下语句 git pull:将远程仓库的当前分支与本地仓库的当前分支合并 git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并 将云端某个分支的最新版本同步到当前节点,所以pull有两个概念,一个是将云端的分支拿下来,第二个就是merge一下
不一定非要将远程对应的分支合并到当前分支,也可以和另外的分支合并
将云端放到本地
git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地
将某一时刻的工作区包括暂存区全都存到栈(stash)里
stash这个栈可以存储所有没有持久化的修改,这个只跟本地相关 就是,当你的暂存区有修改的内容,你在本地再次修改,网站突然崩了,你也不想对这些内容进行持久化的操作,这时候就可以用stash
暂存区和工作区,虽然和目录是独立的,但是如果我们切换完分支之后会导致目录冲突的话,我们就需要解决冲突了,所以每次我们在切换分支的时候,最好把当前的内容先commit一下,再去切换
git stash:将工作区和暂存区中尚未提交的修改存入栈中 git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素 git stash drop:删除栈顶存储的修改 git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素 git stash list:查看栈中所有元素
多人合作
如果自己一个人感觉没办法实现的话,可以通过ssh,远程连到一个服务器,然后两个一起工作
两个人同时关联到云端分支,然后两个人一起写代码 如果两个人同时修改了一个文件,就会出现一个情况
就是在云端有个分支 两个人本地都有跟云端相同的分支,但是两个人分别都有了自己的新的节点,这时候,一个人先进行了持久化,没问题,不会报错,然后如果第二个人再进行持久化,就会报错,因为云端的版本已经改变了,跟本地有冲突
这时候就需要pull下来,然后解决冲突,在进行持久化
不过一般没有冲突,因为一般不会同时修改同一个文件,这种情况一般是自己在家和在公司两个电脑导致的。
怎么在云端合并
网站上会有创建合并请求,就是在云端直接进行分支合并
一般自己没有master权限,所以需要提交请求(不同的云端应该不一样,自己搞吧)
|