GIT基本上是目前最为先进的分布式版本控制系统,经过GIT可以很是方便的管理文件多个版本,可以实现版本的回滚,比对等功能,而且支持分布式也就是多人协同工做。python
GIT也是目前使用做为普遍的版本控制软件,大名鼎鼎的Github网站能直接与GIT对接,使用GIT上传代码到Github之中。linux
一般来讲,Linux系统使用各自版本对应的包管理工具能够很是方便的安装GIT。例如sudo apt-get install git,但安装以后会有一些设置须要配置。git
安装GIT以后比较常见的一个问题,就是中文乱码,能够经过在命令行中设置解决:vim
git config --global core.quotepath false
因为GIT支持多用户协做,因此在使用GIT以前,还须要配置身份信息。首先须要在GIT中配置你的用户名和邮箱地址:缓存
git config --global user.name "name" // 名字 git config --global user.email "123@126.com" // 邮箱
在使用GIT以前,得掌握一个仓库的概念,也就是repository。这个repository也就是一个目录,是GIT管理的单位,在一个repository中,全部文件的新建、修改、删除都会被GIT跟踪到,并加以管理,以便在之后进行还原等操做。安全
因此,使用GIT,首先要建立一个repository。服务器
建立一个仓库,主要能够有两种方式。分布式
【init】ide
init的建立方式为从零开始建立一个仓库,首先须要有一个目录,使用cd进入到咱们想要建立仓库的目录中,而后使用如下命令:工具
git init
便可将当前目录转化为一个repository。目录中会出现一个.git目录,里面保存着全部的版本信息。
【clone】
除了本身从零开始建立仓库外,还可使用别人的远程仓库来建立,例如Github上有许多项目代码,均可以使用这种方式拷贝下来。
git clone git://git.kernel.org/pub/scm/.../linux.git
这样的话会在当前目录生成一个如出一辙的仓库。
建立好仓库以后,就能够在仓库之中开始使用命令来控制此仓库文件的版本了。
在使用这些命令以前,还有几个GIT的基础概念须要掌握,分别是:工做区(working directory),暂存区(stage),分支,版本库。
【status】
在仓库中使用git status命令能够查看当前仓库的状态:
[root@southnorth lianjia]# git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: lianjia/settings.py # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # setup.py no changes added to commit (use "git add" and/or "git commit -a")
其中主要列出了仓库当前所处的分支,被修改了的文件,以及没有被跟踪的文件。
参数:
【add】
在GIT仓库之中,虽然咱们说全部的文件均可以被跟踪,可是这只限于文本文件的修改,GIT没法跟踪二进制文件的修改。
同时,在跟踪以前也须要先将文件添加到仓库的索引中,也就是说,使用add命令添加到索引中的文件,才会被GIT跟踪。在每次你新建或者修改了文件以后,须要你使用add命令将这个文件先添加到暂存区之中。
git add filename
运行了此命令以后,未跟踪文件将会从Untracked files:中转移到Changes not staged for commit:中。
有些时候,可能修改的文件比较多,一个个去用add命令去添加比较麻烦,因此也能够用*来匹配文件名,如下命令能够将全部未被跟踪的文件添加到暂存区中:
git add *
【commit】
在将新文件或者修改事后的文件添加到暂存区以后,就可使用commit命令将其正式提交到仓库了。可是要注意的是,commit提交到仓库的文件状态,是最后一次执行add时文件的状态,而不是执行commit时文件的状态。
因此,在提交文件以前,最好都先使用git status检查一下,有没有须要添加的文件尚未用add添加到暂存区中。而后就能够运行命令了:
git commit
直接运行此命令后,会跳出一个编辑界面,通常默认是使用vim。以下所示:
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Your branch is up to date with 'origin/master'. # # Changes to be committed: # modified: "hello.md"
这里实际上是须要你输入一些关于这次commit的一些信息,对这次代码提交作必定的标识,方便之后若是须要还原版本的时候清楚代码的改动。对此信息保存退出后,则commit提交成功。
参数:
-a - 虽说可使用add命令对commit提交的暂存区作很精细的改动,可是当提交的文件很是多的时候,则add起来会比较的麻烦。因此commit提供了-a参数,使用此参数,则会自动将已被追踪的修改过的文件添加到缓存区中,不用再手动add添加了。
-m - commit提交的时候须要输入信息,有时候若是但愿输入的信息比较少,则可使用-m参数直接在命令行输入。以下所示:
git commit -m 'message'
【rm】
若是须要移除仓库中已经被追踪的文件,那么最好使用GIT提供的rm命令来删除,会更加安全:
git rm filename
此删除命令会将磁盘上的文件一并删除,在commit后,此文件将不会再被追踪。
参数:
-f - 若是删除的文件已经被修改过,或者已经被添加到暂存区中,那么则须要用-f参数强制删除。这是一个保护措施,由于还未被提交的修改不会被保存下来,是没法恢复的。
--cached - 若是但愿某个仓库中的文件再也不被GIT跟踪,可是依然被保存在磁盘里,这种时候可使用--cached来删除。在错误的添加了文件到仓库中后,这个参数很是有用。
git rm --cached filename
【reset】
使用GIT最大的一个好处是,GIT会将你提交的每一个commit保存下来,以供你之后在出现问题后,可以很是方便的回滚版本。回滚版本的其中一个命令就是reset。
在你将一些文件使用add命令添加到暂存区以后,使用git status命令查看状态时能够看到提示,若是想将添加到暂存区的文件取消暂存则可使用如下命令:
git reset HEAD <file>...
在这里,HEAD表明的是最近一次的commit,此命令的意思则是将指定文件回滚到最近一次commit提交的状态。
若是没有指定文件的话,那么将会回滚整个仓库的状态,以下:
git reset HEAD
版本表示:
回滚的时候能够指定回滚的版本,版本的表示方式有三种,默认状况下都是指向最近一次提交:
参数:
【diff】
git diff命令能够查看两次文件内容有什么不一样。使用如下命令能够查看工做区和版本库中最新版本的区别。
git diff HEAD -- <filename>
在这里--表示的是工做区,HEAD表示的是最近一次commit提交的版本,还能够用--cached表明暂存区。
在没有指定的状况下,是默认查看工做区和暂存区的区别:
git diff <filename>
【log】
使用git log命令,将会用如下的格式输出提交的commit日志记录,若是记录较多的话,须要按q键退出查看。
$ git log commit 69b8e6b3ebff7b84d6190a374475a20482d4c3ba (HEAD -> master, origin/master, origin/HEAD) Author: wnanbei <wnanbei@gmail.com> Date: Thu Nov 15 17:16:53 2018 +0800 add git branch part commit 28056c5055ef9ed4156b74713c0205e8fde44713 Author: wnanbei <wnanbei@gmail.com> Date: Thu Nov 15 15:21:30 2018 +0800 complete basic git command commit 6f6aae904ad7551d49ab952e9e3afae70bc93c50 Author: wnanbei <wnanbei@gmail.com> Date: Thu Nov 8 17:19:46 2018 +0800 add git
参数:
--oneline - 每条commit日志只显示一行内容:
$ git log --oneline 69b8e6b (HEAD -> master, origin/master, origin/HEAD) add git branch part 28056c5 complete basic git command 6f6aae9 add git
--skip - 指定跳过前面几条日志:
$ git log --skip=4 --oneline b9922fc add git edd4594 change the python file name a9cded2 add git article
-[length] - 指定输出的日志数量
$ git log --oneline -2 69b8e6b (HEAD -> master, origin/master, origin/HEAD) add git branch part 28056c5 complete basic git command
--pretty= - 使用其余格式显示提交信息,可选项有:oneline、short、medium、full、fuller、email、raw,默认为medium。
--graph - 在左侧以图形的方式显示提交的commit变更,更清晰的展现分支的合并等信息。
--decorate - 展现更多的信息,例如HEAD、分支名、tag。
--author - 经过提交者的名字来搜索提交信息。
--grep - 从提交的关键字搜索提交信息。
-p - 经过路径搜索提交信息
git log -p -- config/my.config
【tag】
在GIT中还有一个很是方便的功能,就是打标签,能够给某个特定的commit进行标记。比较普遍的一个方式使用它来标记版本号。使用如下命令将会给当前分支最新的一个commit打上tag。
git tag <tagname>
若是你须要指定给某个commit打tag的话,则须要你在命令后面加上commit的id。
使用如下命令能够查看tag的信息:
git tag # 查看本地全部tag git show <tagname> # 查看指定tag的详细信息 git ls-remote --tags <remotename> 查看远程全部tag
须要注意的是,咱们建立的tag都是只存在于本地的,因此若是要把tag同步到远程仓库的话,须要额外单独的使用命令同步tag。
git push <remotename> <tagName> # 推送单个tag到远程仓库 git push <remotename> --tags # 推送全部未推送的tag到远程仓库
参数:
在GIT之中,有分支的概念。在这里举一个例子,你但愿在你的工做项目上新增添一个功能,那么你就能够在当前项目的基础上新开一个分支,而后在这个专门的分支上开发的你新功能,而原来的工做项目不受任何影响。等到你的新功能开发完毕经过测试后,就能够将这个分支与以前的工做项目分支合并了。
这种开发方式,可以将工做从开发主线上分离开来,避免工做时影响到工做主线。
因为GIT的分支实现原理跟指针相似,因此建立切换合并分支都是很是迅速的。GIT也很是鼓励新建一个分支去完成任务,任务完成后和主分支合并,而后删除掉这个新分支,这样使用下来与直接在主分支工做是差很少的,可是安全性要高很多。
【branch】
首先,直接使用git branch命令是查看当前仓库的分支:
git branch
若是在git branch命令后面跟上一个名字,则能够在当前仓库新建一个分支:
git branch working
也可使用当前分支的某历史版本建立分支,这样的话须要指定具体的commit的ID:
git branch working 169d2dc
须要注意的是,仓库通常默认会有一个master分支,这个分支其实并无什么特殊,跟其余新建的分支没有什么区别,只是在git init时默认会建立这样一个分支,大部分人也懒得去修改。
参数:
-d - 若是在建立以后须要删除一个分支,能够加上此参数。
git branch -d working
【checkout】
在建立了分支以后,咱们所处的依然是以前的分支,要切换到新的分支的话,依然是须要咱们手动切换的。
git checkout working
参数:
【merge】
在建立了分支以后,大部分状况下最终都是要合并的,也就是将分支修改的内容和另外一个分支的修改内容合并到一块儿。
使用git merge命令将能够把某一分支与当前分支合并到一块儿:
git merge working
若是两个分支之间没有冲突的话,那么分支的合并将会很是简单,GIT会自行决定如何合并两个分支。可是若是两个分支之间有文件冲突的话,也就是说两个分支内都对同一个文件进行了修改这种相似的操做,GIT将没法决定保留哪个分支的内容。
由于在逻辑层面上,也须要由你本身来决定,在冲突的状况下,保留哪一个分支的内容。在这种状况下,合并的时候会显示相似如下的内容:
CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result.
在冲突的文件内,GIT会将两个分支的内容都放在了一块儿,由你自行修改:
<<<<<<< HEAD i am master ======= hello, i am working >>>>>>> working
能够看到====分割上方的是当前分支的内容,下方是合并的working分支的内容。此时由你自行修改,处理完冲突以后,add添加好就能够提交了。
在前面讲的用法基本上都是本地的GIT用法,可是使用GIT很大的一个优点是能够多人协做,同时完成项目,那么这基本必然要涉及到远程仓库的使用。远程仓库能够本身在服务器上搭建,也可使用一些其余人提供的仓库托管服务,例如Github这个全球最大的同性交友网站。
使用init命令生成的仓库中,是没有配置远程仓库的,须要自行配置。而若是是使用clone获取的仓库,则会未来源的远程仓库默认配置为一个名为origin的远程仓库,这个远程仓库没有什么特殊,只是默认起名而已。在一些比较复杂的多人合做项目中,会配置有多个远程仓库。
【remote】
使用git remote命令便可查看当前仓库有配置哪些远程仓库:
$ git remote origin
若是你须要添加新的远程仓库,那么可使用如下命令:
git remote add <shortname> <url>
<shortname>是你给这个远程分支起的名字,这个名字只会在本地起做用。
如下还有一些显示与删除等命令:
git remote show [remote-name] # 显示远程仓库详细的信息 git remote rename old_name new_name # 重命名远程仓库 git remote rm remote_name # 删除远程仓库
参数:
【fetch】
在配置了远程仓库以后,就能够从远程仓库拉取内容了。这个命令会访问远程仓库,从中拉取全部你尚未的数据。 执行完成后,你将会拥有那个远程仓库中全部分支的引用,能够随时合并或查看。
git fetch [remote-name]
若是须要只拉取某个分支的内容,须要在后面加上分支的名称。
git fetch origin master # 拉取远程仓库origin中的master分支 git fetch origin master:temp # 拉取远程仓库origin中的master分支,并命名为temp分支
须要注意的是,fetch这个命令只是将版本库中的内容拉取下来,并不会自动合并和修改你工做区中的内容,须要你自行手动合并。
以后须要合并拉取的内容到工做区的话,须要使用git merge命令。
git merge FETCH_HEAD
这里的FETCH_HEAD是一个版本连接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
通常来讲一个比较常见且安全的使用方式以下:
git fetch origin master:tmp # 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支 git diff tmp # 来比较本地代码与刚刚从远程下载下来的代码的区别 git merge tmp # 合并temp分支到本地的master分支 git branch -d temp # 若是不想保留temp分支 能够用这步删除
【pull】
若是以为使用fetch命令比较麻烦,且肯定远程仓库的内容能够安全合并的话,那么可使用pull命令。pull命令实际上是一个混合命令,至关于把git fetch和git merge这两个命令合并到了一块儿,一个命令直接解决问题。
git pull origin
【push】
在多人协做完成项目时,本地工做完成后,须要推送到远程仓库中,这个时候须要使用git push命令来进行推送。这个命令的用法以下所示:
git push <远程主机名> <本地分支名>:<远程分支名>
若是当前分支只有一个远程分支,那么主机名与分支名均可以省略:
git push
若是当前分支与远程分支存在追踪关系,则能够省略分支名,只留主机名,例如:
git push origin
若是只省略远程分支名,则表示将分支退送到与之存在追踪关系的分支,若是远程分支不存在,则建立新的远程分支:
git push origin master
若是只省略本地分支名,则表明删除指定远程分支:
git push origin :master
在使用GIT管理项目时,咱们项目里经常会有一些文件是不须要归入版本管理的,例如Mac系统的.DS_Store之类的默认文件,又好比Python的运行生成的__pycache__目录。
若是这种文件较多时,咱们添加文件将变得比较的麻烦,因此GIT给咱们提供了一个方式,能够忽略掉指定的文件。
首先是配置全局忽略,GIT管理的仓库都能起效。配置的方式有几种,咱们这里主要使用.gitignore文件来进行配置。
首先咱们须要建立一个.gitignore文件,这个文件放在哪里均可以,但推荐的位置是直接放到家目录中:
touch .gitignore
而后,咱们须要将此文件配置到GIT中(若是有修改文件路径的话,这里须要相应的修改):
git config --global core.excludesfile ~/.gitignore
最后,咱们再来编辑.gitignore文件,将须要忽略的文件写到这个文件中便可,文件内格式以下所示:
.DS_Store __pycache__ *.pyc .vscode
若是须要按照具体的项目来配置特定的忽略文件的话,那么能够配置一个.gitignore文件直接放到仓库的根目录便可。