由于我使用的是ubuntu20.04,所以我直接在终端里安装了
sudo apt-get install git
安装好了之后,我们需要先定制我们的Git环境,其中git自带一个git config
的工具来控制git的外观和行为的配置变量。你可以通过
git config --list --show-origin
来查看所有的配置及它们所在的文件。
当然你现在肯定是没有配置信息的,所以你现在要做的事就是设置你的用户名和邮件地址。这一点很重要,因为每一次提交都会用到这些信息。
git config --global user.name "用户名"
git config --global user.email "邮箱"
这里如果你使用了--global
选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有--global
选项的命令来配置。
获取git仓库有两种方式:
第一种方式:对你打算放置项目的文件夹,使用
git init
这是初始化一个git仓库,相当于你电脑上的git已经认识了这个文件夹。后续这个就是你的git本地仓库了。
第二种方式:也是找到一个文件夹,新建也可以,使用
git clone "URL"
这个URL你可以在github上的仓库的code
看到,点一下,有http,ssh多种协议,我这里用的是ssh。
这样你就可以把别人的仓库复制到你的这个文件夹中来进行后续操作了。
不管是哪种方法,你都可以在你的文件夹内发现一个新的.git
的隐藏文件,这个就是你和初始化git仓库相关的文件,如果你不想要git对这个文件夹进行版本控制,你可以直接删掉.git
。
你现在已经在你的项目文件夹里初始化了git仓库,现在你可以直接在本地该修改的修改,该增添的增添,等你准备提交的时候。
先将工作目录切换到你的git仓库的目录下。
你可以用
git status
来查看当前本地仓库的状态,git会告诉你,你修改了哪些文件,删除了哪些文件,哪些文件未被跟踪(一般也是新添加了哪些文件),然后你可以用
git add <具体某个文件>
git add * //带*表示把所有和原来仓库有变动的文件加进去,就不用一个一个加了
添加进暂存区之后,你可以再次使用git status
来查看仓库里文件的状态,观察有啥变化。
再使用
git commit -m "备注信息"
这个时候,你就相当于创建了一个新的提交。当然你可以理解为这是你在本地的最后确定。它们还并没有推送到你的github上。
使用
git push origin
origin
是什么?你可以理解为你的远程仓库的简称,当你clone
你的仓库的时候,git会自动给你的这个本地仓库添加一个追踪的远程仓库,默认取个名叫origin。
如果你不是clone
的仓库,那自然就需要添加一个追踪的远程仓库。
git remote add origin
这就是给你的本地仓库添加一个远程仓库,不然git也不知道要推送到哪去。。。
而这里的分支是什么?后续我会补充,你可以先用git status
来查看你当前所在的本地分支,然后git push origin <分支>
中的分支就写你当前所在的本地分支。
如果你之前配置好了ssh免密登录,那么就不需要输入用户名密码了,可以直接推送到对应的仓库去。
但是可能在你push
的时候,会和别人发生冲突。举个例子,你把仓库clone
了下来,在你修改的过程中,别人推送了新的东西,之后你再提交,这个时候就有问题了,因为你的远程仓库此时并不是最新的。
此时你可以先用
git pull
拉取当前你还没有的数据,保证和github上的仓库同步。当然,这时候可能会有部分文件有冲突,因为你并不能确保别人不会和你修改同一个文件。但是git会很贴心地给你把冲突标出来。你可以用git status
来查看。当你解决冲突的时候。
再重新添加你修改的文件,推送一次。
这就是github的推送过程的简单描述。
当然还有以下命令你也可能用到:
git remote rename //远程仓库的重命名
git remote remove //远程仓库的移除
git remote -v //查看当前本地仓库的远程仓库
git diff //查看当前仓库修改的详细信息
git log //查看提交历史
//还有一些我想到了再后续补充
前面提到的分支可能会让人一脸懵逼。你可以理解为分支就相当于github的平行宇宙。比如说,现在你的项目开发到了一定程度,此时你有两个想法,你想看看哪个想法的效果要好些,但又怕两个想法效果都不好。那你可以此时
git branch <新的分支> //分支的名字可以随便取
这条命令能让你创建新的分支。创建完之后你可以通过
git branch
来查看你当前的本地仓库里有哪些本地分支。在开发过程中,你也可以使用
git checkout <已有分支>
git checkout -b <新的分支> //直接创建一个新的分支并切换到它
来切换本地分支,从而在不同的"平行宇宙"之间进行修改。
当然,你也可以对你的本地分支进行合并。比如说,我想将master分支和我在master
分支工作时新创建的m1
分支进行合并,那我就可以先切换到master
分支,在使用git merge m1
,将master
与m1
合并。此时你或许不在需要m1
了,因为此时已经有master
可以代替它,那么,利用git branch -D m1
来删除m1
分支。
那么当你修改完要推送的时候呢,还记得我上文提到的git push origin <你当前所在的本地分支>
,这里的所要填写的分支并不一定要是你当前所在的分支。也就是说,你完全可以在任意分支里工作完成后推送到任意的远程分支。一般有以下两种情况:
git push origin <你当前所在的分支>
,这个与上文讲的没有区别,这种情况下你大可不必考虑他这个远程分支是否存在,因为即使不存在,git也会自动帮你创建。git push origin <你当前所在分支>:<你想推送的远程分支>
。这个首先就得保证这俩分支都已经存在了。其实我们的每一个本地分支都可以有一个追踪远程分支。注意!我说的是“可以有”!
在这里你可以用git branch -vv
来查看你本地的所有分支是否都有追踪分支。你可以发现,你在本地亲自创建的分支都没有追踪分支(当然,这是在你没有刻意添加的情况下)。
但是要注意,当你clone
一个仓库的时候,他会默认给你创建一个叫master
的本地分支,和一个叫origin/master
的远程分支。
那么要如何追踪github上不同的远程分支呢?
首先,你可以尝试性地用git remote show origin
来查看origin
仓库里是不是有新的分支(比如别人创建的,而你这里没有),或者分支有没有更新啥的。之后,你可以用git fetch origin
来先更新下你仓库的远程分支。然后再无误地进行下面的操作:
git checkout -b / //本地新建一个分支同时添加一个追踪远程分支并切换到它。
git checkout //或者更简单粗暴一些,不管你本地分支存不存在,直接切换到你想追踪的那个远程分支,git要是发现远程仓库里恰好有这么一个分支,它就会自动帮你创建并跟踪。
git branch -u / //修改或是添加当前本地分支的追踪远程分支
追踪分支有什么用呢?当你确保你的本地分支有了对应的追踪分支后,你就可以简单地对对应的远程分支进行git pull
,git push
等一系列操作,不需要在特地指明去哪个分支拉取,推送去哪个分支。
现在再来补充一下再git基础命令中没有讲清的地方。
我们前面提到了使用git pull
用来拉取数据,其实还有一个和它有点类似的git fetch
,这两个都是从跟踪的远程分支来拉取数据(当然,你要指定拉取数据的分支的话可以在后边添加origin
)。
可二者的区别在于,git pull
是先更新你仓库的远程分支,也就是拉取追踪的远程分支中你本地没有的数据(比如说别人向这个分支推送了新的东西),然后对你当前正在工作的本地分支合并。对!这将会改变你本地的工作目录,但是有冲突的地方git会提示你的。
git fetch
则仅仅是更新你的仓库的远程分支,这样就不会突然改变你本地分支里边的东西,你可以安心地继续创作,当然最后你也可以利用git merge orgin/
来将当前工作的分支与你想合并的远程分支合并。因而才会有形象的说法:git pull=git fetch + git merge
。
这二者都可能会产生冲突,你得先解决冲突,再进行后续操作。
前面有提到删除本地分支,那自然也会有删除远程分支:
git push --delete
当然关于分支远远不只这些,这些只是基础的,后续我再进行更新。大家也可以参考git-book这里边讲得很详细,要是时间充足的话,完全可以啃这个。