4

Git原理的理解

git分区:

  • 远程仓库
  • 本地仓库
  • 工作区
  • 缓存区
git主要由这几个分区组成,git的各种命令其实也是围绕这几个分区来展开的,接下来将通过这几个分区来理解git的各种操作;
git init
  • git init 操作是初始化一个git本地仓库,工作区,和缓存区,此时还没有远程仓库与其同步;
git clone

clipboard.png

  • git clone直接将远程仓库和本地仓库以及工作区间同步
git add
  • 平时对代码的操作,实际是在工作区操作,当对代码修改完毕后,就会使用git add;git add 操作是将工作区的文件加入到缓存区中;
git commit
  • 当需要将本地修改完成的代码提交到远程时,需要使用git commit命令;这一命令是将缓存区的代码提交到本地仓库;
git 切换分支时会把未add或未commit的内容带过去,这一点值得注意。为什么呢?因为未add的内容不属于任何一个分支,未commit的内容也不属于任何一个分支。也就是说,对于所有分支而言,工作区和暂存区是公共的。
要想在分支间切换, 又不想又上述影响, 怎么办呢? git stash搞起。要注意,在当前分支git stash的内容, 在其他分支也可以git stash pop出来,为什么? 因为:工作区和暂存区是公共的。
git push origin 分支名
  • 当要把代码从本地仓库提交到远程仓库时,则使用git push,将本地仓库的代码提交到远程仓库;

clipboard.png

git push = git fetch + git merge

clipboard.png

  • git fetch操作首先将远程仓库同步到本地仓库,git merge操作将本地仓库合并到工作区;因此git pull操作最终的效果就是将远程仓库的最新代码合并到了工作区
有时候在git push的时候,常常会出现push被阻止的情况,这是因为远程仓库被其他人更新了,当前分支落后了其他人的commit,需要先将远程分支pull到本地工作区,再看有没有冲突(多人同时修改了一个文件),若有冲突则解决冲突以后再进行提交;

但有时候还会出现git pull失败的情况:
clipboard.png
这是因为本地工作区间跟远程仓库的新代码冲突了:
clipboard.png
这时需要解决冲突后提交本地修改。
缓存区 除了开始出现外,后续提交代码、更新代码篇章都在打酱油;终于,这次冲突解决事件, 它将会是主角
解决冲突后提交本地修改的思路大概如下:
1.将本地修改的代码放在缓存区;
2.从远程仓库拉取最新代码;
3.拉取成功后再从缓存区将修改的代码取出, 这样最新代码跟本地修改的代码就会混杂在一起;
4.手工解决冲突后;
5.提交解决冲突后的代码;
clipboard.png
clipboard.png

  • 具体的操作步骤如下:
1.git pull
出现报错信息:
error: Your local changes to the following files would be overwritten by merge:
README.md
Please, commit your changes or stash them before you can merge.
Aborting

2.git stash

3.git pull

4.git stash pop

clipboard.png

5.手工解决冲突后:
git add README.md

6.git commit -m 'solve conflict'

7.git push origin

clipboard.png

撤销操作

git reset --soft HEAD^

这样就撤销了commit操作,但是代码仍然保留了下来

说明:

HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2

--mixed 默认参数,
git reset --mixed --soft HEAD^与
git reset --soft HEAD^是一个效果

--soft,
不删除工作空间改动代码,撤销commit,不撤销add

--hard
删除工作空间改动代码,撤销commit,撤销add,
完成这个操作后就恢复到了上一次commit的状态

如果commit注释写错了,只是想改一下注释,只需要:
git commit --amend
此时会进入默认vim编辑器,修改注释完毕后保存就好了。

撤销add  
git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了   
git reset HEAD XXX/XXX/XXX.java 就是对某个文件进行撤销了

关于git的config文件

在git中,我们使用git config 命令用来配置git的配置文件,git配置级别主要有以下3类:

  • 仓库级别 local 【优先级最高】
这个配置文件通常位于clone后代码仓库的.git隐藏目录下的config文件
  • 用户级别 global【优先级次之】
这个配置文件通常位于
~/.gitconfig 文件,具体到你的用户。你可以通过传递 --global 选项使 Git 读或写这个特定的文件
  • 系统级别 system【优先级最低】
/etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。如果你传递参数选项’--system’ 给 git config,它将明确的读和写这个文件

具体的操作指令就不在赘述,网上能搜索到很多相关的文档和资料;
在最近的一些学习过程中,发现一个问题;若本地有两个不同的代码仓库,想分别用不同的用户去提交,该如何操作呢?
由上面的背景知识就可以知道,我们可以使用仓库的local级别配置文件来给每个仓库设置不同的用户;

git config user.name "wzj"
git config user.email "wzj@qq.com"

这样就可以不同仓库使用不同用户去提交了;

没有权限提交到git仓库的解决方法

在学习过程中,当clone后的仓库修改后,提交时却出现了

remote: Permission to bytewang123/basic.git denied to bytewong.
fatal: unable to access 'https://github.com/byte/basic.git/': The requested URL returned error: 403

通过显式的在config文件的url中增加
https://git用户名@
github.com/...,即可解决

完整示例:

[remote "origin"]
url = https://git用户名@github.com/git用户名/仓库名.git

常见问题汇总

  • git status出现提示Your branch is ahead of 'origin/master' by 1 commit

当运行 git status ,git会将本地分支dev与它正在跟踪的远程分支进行比较(origin/master),因为origin/master没有被改变,它仍然是当前dev分支(和origin/dev)后面的1提交/更改,所以会出现提示。


参考文章:
https://www.cnblogs.com/cb032...
https://blog.csdn.net/w958796...
https://www.cnblogs.com/aries...
https://my.oschina.net/newcha...


byte
106 声望13 粉丝