这篇文章使用自己的语言加工了一下,说白了就是啰嗦了一下。 建议使用git的学习的人用直接到第7点《7、自己练习使用git,和工作中有什么不一样》。 如果你是新手可以先收藏,遇到不会的直接在网页全局搜索,看一下我的解释。 因为git只是一个工具而已,你学习git的时候用的不是很多,你现在把我这篇文章看会了,可能到时候还得重新学。 听我的,上班时再学这些。不然不长记性的
其他教程请看这里
剖析--使用git pull、git push解决代码冲突的本质
1、Git 用户配置
需要分别配置自己注册的github的用户名和邮箱
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
比如你的用户名是akangwu,注册邮箱是akangwu@163.com
此时配置代码就变成了下面这种:
$ git config --global user.name "akangwu"
$ git config --global user.email akangwu@163.com
可能你看文章
$ git config --global user.email akangwu@163.com
邮箱都是加双引号的,就是写成这种$ git config --global user.email "akangwu@163.com"
。为了和上面设置用户名的双引号保持一致,无论哪种方式,都可以成功
如果你使用
$ git config --global user.email "akangwu@163.com"
双引号的设置方式,一定要使用英文的双引号,配置邮箱也是一样的。
重置自己的用户名,邮箱等操作
$ git config --global --replace-all user.email "输入你的邮箱"
$ git config --global --replace-all user.name "输入你的用户名"
2、git配置的用户名和邮箱等信息
$ git config --list //查看所有配置
$ git config user.name //akangwu 这是我配置的用户名,github用户名
$ git config user.email //akangwu@163.com 这是我配置的邮箱 github注册的邮箱
3、git版本状态
- Untracked---没有被追踪的文件,表示没有使用
git add ./
添加文件到暂存区 - Unmodified---没有修改的文件,指的是工作区没有文件进行改动
- Modified---工作区有文件进行了相关改动,在暂存区使用
git status
文件是红色的。需要使用git add ./
命令,将修改的文件添加到暂存区,Staged。再次使用git status
文件是绿色的 - Staged---工作区的文件添加到了暂存区就变成了暂存的文件
4、查看相关提交信息
当然这个提交信息也可以从自己公司的git上面查看一下具体的修改信息。
这个命令也可以取一个别名。这个会在后面解释操作
- git log --pretty=format:"%h - %an, %ar : %s"
-
git log
---显示所有提交日志的信息; -
git log --oneline
---这个命令和git log
功能类似,只不过这个是更为精简一些,oneline,顾名思义,一行,也就是说log 日志在一行上面显示;
5、白话git 的常用命令
-
git branch
---查看本地的都有哪些分支;只能查看本地分支,不能查看本地分支和远端分支的对应关系; -
git branch -av
---可以查看本地分支和远端分支的对应情况,也可以查看远端分支都有哪些分支。解决了git branch
的短板问题 -
git chekcout dev
---这个命令的作用是在当前分支下切换到dev分支,这个分支名称可以随意取 -
git checkout -b dev2
---这个命令和上面的命令多了-b
意思就完全不一样了。表示新建一个dev2分支,并且切换到dev2的分支;注意,这里原来是没有dev2的分支的,创建并切换。 -
git merge dev2
---merge合并分支。必须要保证两点:1:两个分支有共同的commit id;2:合并哪一个不能是在哪个分支上。这个需要合并dev2的分支,所以我们需要git checkout master
--->git merge dev2
---这样master分支就有了dev2分支的代码了。如果需要提交需要执行:git pull
--->git push
-
git stash
这条命令用在什么地方呢?
工作中可能又这么一种情况:你在慢悠悠的修改某个文件,或者增加新功能;突然测试小姐姐给你提了一个bug,需要你修复一下。
但是你在本地的另外的一个分支上修改的,再次新建分支git肯定会提示你不能切换分支,因为你当前分支还有修改的文件。
但可是你现在修改的文件可能会影响后面需要修复的一个bug,引发出一连串的问题。所以就不能使用
git add ./
了。就可以使用git stash
相关的命令了-
git stash
---直接使用git会自动给你当前的代码添加到异世界,到时候需要的时候再拿回来; -
git stash save "save message"
---这个命令和上面的功能一样,不过这个可以自己添加备注信息。git stash
也有信息,只不过是git自动添加的,stash一多,就不太分得清哪个是哪个了,所以使用这个命令比较友好; -
git stash list
---查看你在异世界都放了多少个文件,list 一个清单,很容易理解 -
git stash pop
---前面只是放了文件,也查看了文件,那么当我们解决完了bug,还想要继续修改的时候怎么拿回原来的代码?使用这个命令可以直接将最近的stash的文件拿回来;并且会删除相应的异世界里面的对应的list中的第一个。那么我只想修改,不想删除呢怎么办?看下面这条命令:
-
git stash apply stash@{1}
---apply 应用,引用的意思。每次你往异世界扔了文件你都会有一个stash@{num}
,使用哪个num就是几就行了; -
git stash drop stash@{num}
---上面使用apply只是应用,不是删除;但是我应用完了,不需要stash里面对应的文件了就可以使用这个来删除对应的文件了。 -
git stash clear
---这个是暴力手段,相当于王炸!一次性全部清空你之前在异世界里面扔的所有stash文件
-
-
git add ./
---这个命令应该都知道的吧。就是把工作区的文件添加到暂存区。如果使用的是git add a.txt
表示添加了a.txt文件到了暂存区,当我们修改了几十个上百个文件的时候,如果单独使用git add b.txt
git add c.txt
太麻烦了。所以就有了
git add ./
作用是将所有修改的文件一次性添加到暂存区 -
git remote rm origin
---这条命令用在什么地方呢?你进了项目组,正常使用git进行开发。突然有一天你老大告诉你,我们的git地址变了。你们需要重新设置一下地址。
其实有了思路就很简单,首先git的远端地址不能有两个,你需要删除旧的,然后增加新的,问题就解决了。-
git remote rm origin
---先使用这条命令将原来添加的给删掉。origin就代表了自己之前设置的git地址; -
git remote add origin git@git.code.tencent.com:implement-project/hebei.git
---origin 后面是你老大新给你git地址,这样就可以正常操作了。 -
使用
git pull
先拉取一下代码。虽然有过程你看着成功了,其实没有成功。别怕,后面接着说。 -
使用
git push
发现不成功,提示当前分支没有和远端分支做对应。git push --set-upstream origin master
。 -
后面就成功了,以后该怎么操作就怎么操作了。
-
-
git commit -m
---给自己修改的文件添加备注 -
git pull
---这条命令使用在想要提交代码之前,避免冲突时候使用的。或者说同时修改了文件,你想看看效果啥的也是可以使用的 -
git push
---提交代码,一次后面使用了origin,以后提交就不需要使用这个了 -
git commit -a -m 'added new benchmarks'
---平时我们修改了代码需要使用git add ./
提交到暂存区然后git commit -m ''
。如果你确定了整个文件夹修改的内容都需要添加的,就可以使用git commit -a -m ''
,这条命令把两个合为了一条命令。 -
git commit -amend
---重新编辑commit信息。用在什么地方呢?
-
你commit一条信息,突然忘记了有个文件没有修改,修改好了后
git add ./
,但是我只是忘记修改了一个文件,我还想重新编辑一下commit的信息就可以使用git commit -amend
了; -
有的人可能会问了,上面我使用了
git add ./
添加到了暂存区,但是我还想要保存上次的提交信息不想修改怎么办?别急,这条命令可以帮助一git commit --amend --no-edit
。--no-edit就是没有不编辑的意思了; -
或者,单纯的觉得上次的commit信息特别模糊,或者有个错别字想要重新编辑一下也可以使用这条命令;
- 具体怎么使用呢?这个就像linux命令修改文件内容一样。
i
是编辑内容;shift + :
是即将退出当前界面,然后按wq
退出并保存,就大功告成了。贴一个链接git commit -amend 的用法 - 编辑之后只会保留你更改的commit信息,更改之前的是不存了。
-
-
git reset HEAD file
---将暂存区的文件撤销到工作区。什么意思呢?就是说我们使用了git add ./
后发现有个文件不想填进去了,就可以使用这条命令了 -
git checkout --a.txt
撤销某一文件的修改,这里是工作区。如果是想要全部撤销的话直接使用git checkout ./
,这里是撤销工作区的全部修改。这条命令执行之后工作区的修改的文件都会回到最开始没有修改的时候了。 -
给命令起别名
Git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。 这里有一些例子你可以试试:
这意味着,当要输入 git commit 时,只需要输入 git ci。 随着你继续不断地使用 Git,可能也会经常使用其 他命令,所以创建别名时不要犹豫。
$ git config --global alias.co checkout $ git config --global alias.br branch $ git config --global alias.ci commit $ git config --global alias.st status alias.b=branch -av alias.ps=push alias.pl=pull alias.cm=commit -am alias.l=log --oneline alias.noc=commit --amend --no-edit alias.wjk=checkout -b wjk-feature alias.f=push --set-upstream origin wjk-feature alias.rmv=remote rm v alias.fv=v/master
在创建你认为应该存在的命令时这个技术会很有用。 例如,为了解决取消暂存文件的易用性问题,可以向 Git 中 添加你自己的取消暂存别名:
$ git config --global alias.unstage 'reset HEAD --' //等价于 $ git unstage fileA $ git reset HEAD -- fileA
比如上面《4、查看相关提交信息》中的
git log --pretty=format:"%h - %an, %ar : %s"
这么长,怎么记得住。所以起别名就很容易记住啦git config --global alias.logs --oneline -d 'log --pretty=format:"%h - %an, %ar : %s"' // 下次使用的时候直接使用git logs 就可以代替命令了 // 需要注意的是:alias是别名的意思,.后面的是别名。后面如果有很多比如这个,就可以使用使用单引号包裹起来,但是不要丢了双引号什么的。 // 如果丢了,就会提示下面这种错误
那么我起别名的时候不想要这个了,应该怎么删除呢?
git config --global --unset alias.logs // 这样就可以了。使用git config -list查看应没有alias.logs的内容了。
6、工作中使用git clone
的后续操作
这条命令都什么时候使用呢?最常见的就是
- 刚刚入职的小萌新,项目组老大或者同事需要给你一个代码仓库的链接;
- 或者自己学习其他代码,拷贝代码的时候的操作
git clone 代码仓库地址
这不就完事儿了吗?这谁不会使用,还用你讲?
首先需要明确的一点是:
origin是git仓库默认的名称,我们采用默认的即可。后面是自己的git仓库的地址
git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默 认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
但是,当你克隆了代码然后自己修改了代码,再次提交的时候呢?你可能会遇到下面几种问题
问题一:远端仓库和本地仓库没有建立联系
这是最常见的,因为新项目或者新的入场工作都是会使用这条命令的。
解决方法一:
git push --set-upstream origin mybranch
// 注意:这里origin是远端分支,默认的;后面的mybranch是自己想要和远端分支建立联系的本地分支的名称;
// 通常你可能会看到下面这条命令
git push --set-upstream origin master // 因为这条命令的master采用的是git clone下来的默认的master分支。如果想要建立别的名字,把master改成别的即可
git push --set-upstream origin branch_A // 是将本地分支的branch_A分支和远端分支建立联系
解决方法二:
git push -u origin mybranch // 这条命令就等同于方案一的git push --set-upstream origin mybranch
// 只不过这条命令比较简单好记而已
解决方法三:
git branch --set-upstream-to=origin/<branch> master // 这条命令更为复杂一些,但是大致意思就是说to origin/下面的分支
// 可能搜到的资料是这种的,意思将远端下的master 和本地的master分支做对应。当然master只是一个名称而已。也可以是其他的名称,看你自己想要怎么建立了
git branch --set-upstream-to=origin/master master
问题二:fatal: refusing to merge unrelated histories
出现这个的根本原因是自己本地的分支和远端分支没有了共同的commit ID,分支之间是通过commit ID来建立联系的。
unrelated
翻译:没有联系的,关系的。
如果你在执行 git push
出现此问题,运行下面命令即可:
// 平时我们使用git push就可以提交代码,出现这种错误我们可以在后面加上 --allow-unrelated-histories,就变成了下面这种。
git push --allow-unrelated-histories
如果你在执行 git pull
命令出现此问题,变通一下,将push变成pull就可以了
// 平时我们使用git pull就可以拉取代码,出现这种错误我们可以在后面加上 --allow-unrelated-histories,就变成了下面这种。
git pull --allow-unrelated-histories
7、自己练习使用git,和工作中有什么不一样
不一样的地方有下面几种
- 自己对仓库有完全控制权限,不能模拟团队开发操作;处理的冲突有限;
- 在工作中如果自己不是项目负责人或者公司只有你一个开发,很少会遇到自己本地新建了项目然后clone,最后提交;
- 下面这些操作只是新手练习的时候出现的;先有本地再有远端和先有远端再有本地都是一个道理,只要你理解了,就发现不分先后,都是一个套路
建立git仓库的方法主要有三种方式
- 自己本地开发了代码,然后想要提交到git仓库;
- 自己的github仓库下面已经有了仓库,并且仓库是空的;
- 自己的github上面已经有了仓库,但是自己在创建仓库的时候出现了在那里勾选了添加readme.md的文件。
第一种、自己本地开发了代码,然后想要提交到git仓库;也就是说现有本地,再从github上面建立了仓库,想要提交到远端
-
初始化本地仓库
git init // 这一步的目的是初始化git的版本库
-
将自己的项目添加到本地仓库
git add ./ // 将所有的文件都添加到暂存区
-
提交到自己本地的仓库
git commit -m "项目第一次提交"
-
本地仓库同步到远程仓库
git remote add orgin git@github.com:akangwu/mysupergo_mini.git
-
推送到远程主分支
git push -u origin master // 这里就是将本地分支代码推送到远端仓库
第二种、自己的github仓库下面已经有了仓库,并且仓库是空的;
直接使用git clone
即可,然后使用编辑器开发工作,修改完直接add-->commit-->push
git clone git@github.com:akangwu/mysupergo_mini.git
第三种、自己的github上面已经有了仓库,但是自己在创建仓库的时候出现了在那里勾选了添加readme.md的文件。
git clone git@github.com:akangwu/mysupergo_mini.git
这种也是一样的操作,和第二种没有区别。无论远端仓库是不是空的,只要执行了git clone
就会把远端仓库的所有文件克隆下来。
如果自己练习的时候使用git clone
之后push代码又问题,请参考第六点《工作中使用git clone的后续操作》
8、git 模糊答疑
-
上游分支、远端分支、远端 都是什么意思?
其实这几个说的都是一个意思,都是指的github仓库里面的分支
-
分支、特性分支是什么?
这个只是本地分支或者远端分支的一个名字而已。比如你本地新建了一个分支a,那么a是为了解决增加某个功能的,a分支就可以叫特性分支。
特性分支,特性,就是指的特定功能的分支
-
本地分支
自己的本地工作的分支,想有多少就有都少
-
线上分支
理论上来说也是可以想要多少就有多少,但是一般情况下,有两个分支一个master,一个develop分支,或者再有一个feature特性分支,也就是特定功能的分支
-
发布=提了=提交了=push代码=
git push
同事经常说,代码发布了,提交了,提了代码,你看一下有什么bug没
就是说的push到了远端
-
拉一下代码=拉代码=pull代码=
git pull
同事经常说,我拉了一下你的代码,发现xx问题
-
到底是先
git pull
还是git commmit
?搜出来很多资料就是这两个没啥区别啊,先用哪个都可以。
但是我要说的是,先使用
git commit
然后使用git pull
。可能你目前来说使用两个都没问题,ok 我不和你刚。等你遇到问题了你就会先用commit再用push了。头铁不可怕,撞墙了就舒服了,hahaa。反正我遇到的头铁的一个小姐姐最后先commit 后pull了。
-
“origin” 并无特殊含义
远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用,
“origin” 是当你运行 git clone 时默认的远程仓库名字
- 如何避免每次输入密码
如果你正在使用 HTTPS URL 来推送,Git 服务器会询问用户名与密码。 默认情况下它会在终端 中提示服务器是否允许你进行推送。
如果不想在每一次推送时都输入用户名与密码,你可以设置一个 “credential cache”。
最简 单的方式就是将其保存在内存中几分钟,可以简单地运行 git config --global credential.helper cache 来设置它。
这个没有试验过,因为我的mac没有出现过这种问题。但是win上面有这种问题。先扔一个链接避免每次输入用户名和密码。以后遇到了再来填坑。。
Git如何清除子目录下的指定文件
- 如图,默认情况下是不能忽略子目录下的指定文件夹
- 我们需要将
dist
build
写成**/dist/
和**/build/
。还需要打开终端清除一下git的缓存git rm -r --cached .
这样再次push才能实现
分支的删除
远端分支
git push origin --delete dev 删除远端的dev分支 或者git push origin -D dev
本地分支
git branch --delete dev 删除本地的dev分支 或者git push origin -D dev
关于是--delete还是-D这个自己搜索一下吧,我基本习惯用-D。写的比较简单