1)工作区(workspace)
程序员进行开发改动的地方,是你当前看到的,也是最新的。平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
2)暂存区(index/stage)
.git目录下的index文件, 暂存区会记录 git add 添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用 git status 查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过 git add 先提交到暂存区,被git管理。
3)本地仓库也称本地版本库(local repository)
保存了对象被提交过的各个版本,比起工作区和暂存区的内容,它要更旧一些。git commit 后同步index的目录树到本地仓库,方便从下一步通过 git push 同步本地仓库与远程仓库的同步。通常是本地电脑上的一个仓库.
4)远程仓库也称远程版本库(remote)
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。通常是公网服务器上的仓库.
下面我以甲员工,乙员工合作开发时候发生的情况为例子:
git fetch
相当于是从远程获取最新版本到本地,不会自动merge.这样做目的,把远程分支信息更新到本地库
git checkout -b 本地分支名 origin/远程分支名
(注意执行该命令,当前路径应该处于含有.git的主目录)
例如:git checkout -b develop origin/develop
解决方法:
git status
查看当前状态
git add filename
添加一个文件到git index (暂存区) 例如:
git add gitTeach.java
或
git add .
添加所有文件到git index (暂存区) 本人不建议使用这个,因为项目跑起来会产生很多xxx.class文件,这些是不需要提交的
git commit -m "描述这次提交最新的修改的内容"
提交并且加注释 到本地版本库
git pull origin 分支名
本地下拉代码与服务器端同步 这步很重要,如果另一个人在这段时间修改了相同的文件内容,则无法push到远程库,报冲突,如果只有本人在这个分支开发则可省略该命令
git push origin 分支名
将本地项目给提交到远程库服务器中
1.左图为甲员工本地的gitTeach.java文件,右图为乙员工的本地的gitTeach.java文件.
乙员工已将代码推上了正式库,所以git远程仓库的代码是乙员工本地的代码.
当甲员工git pull时候,因为都是改了第二行的内容,所以会造成冲突,如下图:
甲员工打开gitTeach.java文件,会发现===为分割线,可以看到上部分<<<<<
如果是编译器,可以选择保留自己,保留对方,也可以选择保留双方,我这边自己删掉符号,整理了顺序.只要pull下来了,就能匹配上版本号,无论怎么修改都能推向远程.
修改完,用git status 查看一下状态, cat 查看一下文件也行
然后提交修改的四连走一波;
以下是乙员工的操作,乙员工被甲员工告知,我合并了代码,你拉下代码,然后乙员工打开了自己的项目git pull 下来 远程仓库合并的最新代码;
情况详细:
乙员工git pull 后,发现gitTeanch.java的文件变动蛮大,觉得想还原看看之前写的代码
解决方法:
git log
看本地commit的日志(包括git commit git pull等)
可以看到commit信息中的修改冲突和祝福描述信息是git pull下来的作者是[email protected].
乙员工想回到git pull之前,就是描述为回礼的commit,对应的是
git reset --hard commit号码
让本地代码回滚到该次git commit时候的代码,同城截取前面一段即可,保证唯一就行了.
例如:git reset --hard 5dfcab95dcde
通过cat查看回滚前和回滚后的gitTeach.java文件内容,可以发现文件已回滚至git pull之前
如果仅仅想让单个文件回滚版本请看githttps://blog.csdn.net/fsgsggd/article/details/79875035
假如这时乙员工头脑发热,想将远程仓库放弃新的提交还原到这个版本
git push origin HEAD --force
在git解开develop分支保护, 远程提交回退 , HEAD☞的是指针,即 develop .
例如git push origin develop --force
develop分支示例
情况详细:
由下图可知:回退后,git log只剩下回退后版本以前的信息;
解决方法:
git reflog --date=iso
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
然后执行查看reset前的commit id
git reset --hard commit号码
让本地代码回滚到该次git commit时候的代码,commit_id截取前面一段即可,保证唯一就行了.
例如:git reset --hard 5bcaecd
只要输入:
git reset --hard 5bcaecd
就是回退到执行reset前一个版本号,也就是恢复回退(reset操作);
个人建议不要使用以下两个回退命令: 有可能出现回退分支到其他提交者的库,从而丢弃本地的commit信息
git reset --hard HEAD^
每加一个^ 就表示更前的一个版本,例如HEAD^^就表示“add second line”这个版本,如果想要回到100个版本前,就需要100个^
git reset --hard HEAD~1
HEAD^换成了HEAD~1 ,其中1代表回退几个版本,如果需要回退到10个之前的版本,只需要把HEAD~1 改为HEAD~10即可
情况详细:
其实这个跟情况三如出一致,都是因为修改了同一文件同一行内容,导致冲突.
下图是远程库gitTeach.java文件,也就是甲员工修改完冲突提交到远程库的版本的该文件
下图是乙员工未执行git pull 操作的文件详情
如果乙员工继续在该文件第三行添加新年快乐
进行提交四连击,会在git pull 提示冲突
gitTeach文件如下图:
git通过比对发现you too 能匹配,但是第三段甲乙都修改同一行,就会出现冲突
解决方法:
解决方法也跟情况三一样,这里就不演示了;记得修改完冲突,告诉合作的小伙伴pull下来,保持本地库与远程库代码的一致性.
甲员工知道后乙员工合并冲突后,很自觉pull下最新代码,并查看改变的详情,发现不错
git show # view the diff of last commit
情况分析:
乙在修改howTOGit.java中,但他并不想这么快提交到版本库,只想提交在gitTeach.java新增的内容 +With the compliments of the season祝贺佳节
解决方法:
只需要在git 提交四连中引入git stash 命令即可,如果你很明确知道远程仓库该文件没有人推新的版本,那么可以省略git stash,不然git pull会报错.
1.git add gitTeach.java
2.git commit -m "我只想提交gitTeach.java"
3.git stash push -m "描述" xxx.java
git stash push -m “把howToGit暂存” howToGit.java 把howTOGIt压栈. 建议一定要加上push,不然默认执行git stash save,这个会把所有修改信息都压栈,我们只需要一个文件,用push就好.-m后面跟描述.
2和3的顺序可以互换,要是想先commit再stash,切记一定要在git stash后面加 push,如果不加会造成git stash把暂存区 git add的文件都压栈了,造成git add失效
4.git pull
5.git push
6.git stash list
查看stash了哪些存储 例如 stash@{0}: On develop: 把howToGit暂存
7.git stash pop stash@{id}
git stash pop stash@{0} 把stash@{0}: On develop: 把howToGit暂存压栈还原
随记:我想说一下遇到的一些事情,以前有同事说我不stash也可以提交我修改的,我只要不用git add 将不提交文件提交到暂存区不就可以了吗,如果这个分支只有一个人,那也行,因为你永远不知道,有没有人在远程推了新的一版该文件,要是推了,执行git pull就会报错.
为什么叫情况七外传,不叫情况八? 因为是发生在情况七的基础上,同样的执行方法只不过加点特殊情况,希望能加深理解:
甲在howToGit文件新增了内容刚好跟乙修改了但不想传上去的文件是同一行
+May you have the best New Year ever愿你度过最美好的新年!
并且甲眼疾手快在乙没推向到远程库(git push)就之前就推向了远程库.
乙员工在情况七,执行完7git stash pop后,会出现特殊情况,也就是甲和乙刚好修改同一份文件同一行,但是乙没提交,而是在本地压栈,当pop出来后,肯定会有冲突的,冲突如下:
甲在howToGit文件新增了内容刚好跟乙修改了但不想传上去的文件是同一行
情况详细:
解决方法:
解决方法跟情况三基本一致,要么保留对方,要么保留自己,要么双方保留,自行修改.
这里展示操作就好了.推上远程库后,记得告诉甲员工pull下来.
情况详细:
原因:
这是由于你修改的文件commit后,git pull时,远程库有人跟你修改同一份文件而且提交上去,但是你和他并没有修改同一行,所以git自动合并,git提示你,你要做个记录吗?
解决方法:
ctrl+x
先摁住ctrl,不松手,再摁x
遇到这个页面后
通常,我们对修改的文件会先git add .,然后git commmit -m “注释”,但是如果commit错了,想要取消commit而且还要保留已经add的文件
解决方法:
git reset --soft HEAD^
或
git reset --soft commitid
这样就会回到刚刚add之后的状态了(HEAD^是上一个版本的意思,如果要回退到前n个,那么就是HEAD~n)
关于git reset的一些参数如下:
--soft
不删除工作空间改动代码,撤销commit,不撤销git add .
--hard
将 add 和 commit撤销,然后删除工作空间代码,恢复到上一个commit结束时候的样子
--mixed
将 add 和 commit撤销,但是不删除工作空间代码,恢复到仅仅修改完后的样子