Git基本概念了解
为了方便以及我们之后正确的了解Git的各个指令的操作含义,我们需要了解几个概念
Git和SVN的差异,以及Git的优势.
- SVN 是集中式管理, 所以如果最为公共仓库的的中央服务器出问题, 所有的工作者都将受到影响.
SVN无法做到本地分支处理, 所以当你去实现一个需要长时间的,创新性的,需要不断探索的功能的时候,就有可能陷入两难的局面: 1.如果提交代码可能会影响到项目的其他模块以及他人工作. 2. 不提交代码就无法很好的保护代码版本, 当你自己想要回到某个代码片段的时候就无法做到. - Git 是分布式管理, 作为客户端不止是提取了公共仓库的文件快照, 而是把代码完整的镜像下来, 所以.如果协同工作的服务器出现了什么故障, 也可以时候通过本地镜像文件去很好的恢复.
另外因为Git是提供本地的仓库管理系统, 所以对于网络的依赖度并不高. 就算没有网也依然可以继续工作.等到有网络的时候再推送到公共服务器即可.
Git的文件状态 (Git可以整体把文件分为已跟踪,和未开始跟踪的两种状态)
- 已修改(modifired): 表示修改了文件, 但是还没有保存到本地数据库中.(即文件的修改部分是Git的未跟踪状态)
- 已暂存(staged) : 表示对一个已修改文件的当前版本做了标记, 使之包含在下次可以提交的内容中去
- 已提交(commit) : 表示数据已经安全的保存在了本地数据库中.
基本的Git 工作流程
- 在工作目录中修改文件
- 暂存文件, 将文件的快照放入暂存区域
- 提交更新, 找到暂存区域的文件,将快照永久性存储到Git仓库目录
因为现在我们在使用Git的时候一般都是会关联一个远程仓库的, 所以在链接远程仓库的前提下,如果你想将本地的代码提交到远程公共仓库, 即在这三步之后先更新代码,然后将代码推送到远程仓库即可.
这里也要给一个小的提示,我们在配置Git仓库的时候 一定要配置忽略文件. 因为其他文章写的都挺不错的, 所以这篇文章就不在做多余的赘述 , 下面给出几个忽略文件配置的参考文章 Git忽略文件的具体配置, Git忽略文件配置
常规流程中的具体指令
git help
查看git指令帮助说明文档, 后续可以跟具体的指令来查看指定的帮助.-
git status
查看文件状态, 可以看到你的哪些文件做了更改以及新增了哪些文件, 是否已经提交到了本地仓库,以及是否有需要上传到远程的文件.
建议经常使用.你可以在你提交文件之前先查看一下你的文件状态, 查看有哪些文件没有提交, 以及提交之后时候有冲突之类.git status 文件名
查看指定文件的状态下面举例一下各种状态下status 的输出情况:(下面举例中的
XXXX
都用来表示为项目中的文件)
如下的情况说明你的Git文件当前状态是十分干净的,没有什么文件改动, 也没有什么未跟踪的文件.并标示出来当前所处分支
$ git status
On branch master
nothing to commit, working directory clean
而如果出现如下情况, 即有Untracked files:
, 并且其下面有内容, 则表示有新文件没有被跟踪到, 需要先加入到暂存当中,才能在下次提交中提交该文件
$ echo 'My Project' > README
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
XXXX
nothing added to commit but untracked files present (use "git add" to track)
或者说是修改了一个已经被跟踪的文件,则他的再次更改的部分就可以理解成为是没有被标记跟踪的状态, status会有以下大概输出格式 Changes not staged for commit:
$ 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: XXXX
当已经有文件已经添加入暂存区, 但是还未提交时, status会做如下显示, 即Changes to be committed:
会显示,并在下方会有内容
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: XXX
modified: XXXX
其实你会发现以上的status输出中, Git都是会给出我们操作提示的, 比如在第一种情况下,有文件添加的时候, Git会在下方提示(use "git add <file>..." to include in what will be committed)
. 就是来提示你可以使用 git add xxxx
的指令来进行操作
-
git status -s
或者git status -- short
如果你觉得上面status
的输出格式不够简洁,太过繁杂的话, 可以使用这个指令.转换为一种紧凑型的status格式输出. 用一下举例
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
其中 :
??
表示了这个文件尚未被标记跟踪,
A
表示新添加到暂存区的文件
M
表示修改的文件.
如果你仔细观察就会发现M
出现的位置是会有差异的, 当M
出现在靠右的位置的时候,代表了这个这个文件的修改部分还没有加入到暂存区, (即下次的提交是无法提交这个文件的修改部分, 如果提交就需要先放入暂存区). 而靠左边的M
则表示了文件的修改部分已经放入到了修改区域.
而像上图示例中的Rakefile
文件. 左右两个位置都标识出来了M
, 则表示之前add到暂存区了一份修改之后, 本地又再次做了一些修改, 所以一部分修改在暂存区没有提交, 还有一部分修改尚未添加到暂存区. 这里我们就要注意到, 我们实际上提交的文件, 是以加入到暂存区的修改文件为最后的提交文件的,而不是你最后的提交时间为止的修改文件, 所以一定要注意如果在将文件加入暂存区之后又做了修改不要忘记将其放入暂存区
获取/创建项目
-
git init
在当前文件路径下初始化一个git仓库-
git init 路径名称
在指定的路径下初始化仓库
-
git clone 远程仓库地址
建立Git本地仓库管理,关联远程仓库,并将内容拉取下来.
其实这个指令是几个指令的一个封装来实现效果的, 它创建了一个新的目录, 切换到新目录.然后git init
来初始化一个空的Git仓库,之后关联你指定的远程仓库 (git remote add
), 再对远程仓库git fetch
, 最后通过git checkout
将远程仓库的最新提交检出到本地的工作目录
一般情况下,如果远程仓库有一个已经在制作的项目, 而你需要本地从零开始跟进这个项目,可以直接用这个指令将项目拉取下来进行跟进.
Git仓库配置
-
git config
git的配置信息. 单独这样配置, 作用域只是你当前的这一个git项目-
git config user.name xxx
配置你的个人用户名称. 这个比较重要一点, 用来查看说明是谁提交了更新. -
git config user.email xxx
配置你的邮箱信息. -
git config -l
或者git config --list
查看你的git配置信息 -
git config --global
配置全局的Git信息. 可以理解为将作用域扩大到了你的整个电脑. 这样当你全局配置了一些通用信息之后 新的git项目就可以不用再次手动配置, 建议 用户名以及邮箱 如果没有特殊需求可以直接这样配置即可, 省事儿.
用法也只是在中间加了--global
. 后面的指令使用和 之前的一样, 比如你要设置全局的用户名, 即git config --global user.name xxx
-
远程仓库相关
-
git remote
通常在我们执行对远程仓库的相关操作的时候, 都会以此命令作为前缀 -
git remote add [remote-name] [URL]
给Git仓库新添一个远程仓库, 你可以给同一个项目添加多个远程仓库, 来处理不同的需求,和他人合作.-
[remote-name]
是你对这个远程仓库设置的一个简称, 你可以在后续的操作中用这个简称指代这个远程仓库. 通常没有什么特别的需求且你这个Git仓库只需要链接一个远程仓库的话,那么你的这个远程仓库可以设置为默认名origin
. - [URL] 即为你的远程仓库地址.
-
-
git remote -v
查看当前项目所连接的所有远程仓库
如果你有多个远程仓库, 你会受到一个类似于下方的输出
$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
#fetch : 标识了你的拉取地址
#push : 标识了你的推送数据的地址
-
git remote show [rename-name]
查看指定的远程仓库的信息.
可以看到远程仓库都有哪些仓库, 这些仓库本地是否已经标记跟踪. 从远程仓库的拉取的数据会和本地的哪一个分支合并数据. 本地分支的数据会推送给远程仓库的哪一个分支等. 具体可以看到以下示例.
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
-
git remote rename [remote-old-name] [remote-new-name]
对远程仓库的进行重命名,[remote-old-name]
表示的是你的远程仓库当前的简称.[remote-new-name]
表示的是需要改成的名字. -
git remote rm [remote-name]
移除远程仓库的关联
添加/修改文件/解决冲突
-
git add 文件名
或者git add .
add
指令是一个多功能指令它可以有以下功能:
1.给指定文件添加跟踪放入暂存区
2.把已经跟踪的文件放到暂存区
3.把合并时有冲突的文件标记为已解决状态
在Git当中, 我们不能把add
理解成添加文件到下一次的提交, 而要把他理解成添加了内容到下一次的提交当中.可能当你从SVN转过来之后可能刚开始会有点疑惑, 为什么有的文件你已经add过了, 你依然需要使用add 指令将其加入暂存区. 因为你使用add指令添加的是内容, 而不是内容,这么想的话,可能会更好理解一点吧.
如果你需要add的文件很多, 或者你懒得去打文件名. 你可以使用git add.
( 注意, 后面跟的是一个<space>.
)
这个指令可以自动将所有未标记跟踪的内容加入暂存区.
提交文件
-
git commit 文件名 -m 提交信息/备注
将暂缓区的文件提交到当前的本地分支仓库.
注意!,一定要跟提交信息, (可以用-m
或者-F
). , 只有写了信息才会提交成功,如果你提交的时候没有编写信息会进入vim编辑让你编辑提交信息, 如果你对vim不熟的话还是直接 用:q
退出后重新提交吧.
这边需要注意的是 如果你使用 -m 指令后面直接跟信息的话, 如果信息是英文, 则需要用
''
将信息包裹, 否则git会不识别, 并会报一下错误. 猜测在纯英文状态下无法识别为字符串吧
fatal: Paths with -a does not make sense.
-
git commit -a -m 提交信息/备注
或者git commit --all -m 提交信息/备注
将已经标记的文件修改跳过暂存区, 直接提交上去 . 其实就是减少了我们的工作流程, 减少了add的这一步
但是需要注意的是:
这个指令是对已经处于标记的文件有效,(即本身文件在Git仓库中存在, 只是做了内容修改的文件) 如果有新增的文件, 则不能够直接用commit -a
去省略操作了. 还是需要将新添文件加入(add .
)暂缓区,添加git标记,使git能够跟踪才可以
查阅/对比不同
*git log
查阅log信息
需要注意的是,这样会进入vim格式. 查阅完毕可以使用wq
退出阅览.
大概出现的格式如下
// (HEAD->master)代表了我master分支上最新的本地提交.
commit 029c5159d8db32fb70d36db0df35312ee346730a (HEAD -> master)
Author: XXX <XXXX@XXX.com>
Date: Mon Oct 15 18:27:27 2018 +0800
项目信息相关
// 后边的(origin/master)代表了我在远程仓库是同步到了这里
commit c3ceb15e42c9af3c8bb1134e165cec5a89f204d5 (origin/master)
Author: XXXX <XXXXX@XXX.com>
Date: Thu Aug 30 18:13:27 2018 +0800
msg
commit 99615aad5faf0dd4ce989e6b86e21e81fef01013
Merge: 0f746f0 50938c4
Author: XXX <XXX@XXX.com>
Date: Mon Aug 20 18:59:27 2018 +0800
Merge branch 'master' of https://github.com/xxx/xxx
commit 0f746f04b01b0bc4878169ce35e0ad0938bdcfcc
Author: XXX <XXX@XXX.com>
Date: Mon Aug 20 18:56:34 2018 +0800
在log 中我们不止能够看到我们每次提交的消息提示, 也能看到每次提交的commitID, 用来区分每次的提交.
并且也能够清楚我们本地文件与远程仓库是否同步.
推送到远程仓库
-
git push [remote-name] [branch-name]
将本地文件中你所指定的分支(branch-name
)内容, 推送到指定远程仓库(remote-name
).
需要注意的是,如果远程仓库中有数据是你没有拉取下来的,那么你需要先执行git pull
指令将数据拉取下来,然后再push.否则会报错.和SVN使用的时候需要先update 再commit同理.-
remote-name
:是你对远程仓库的简写名 .如果你没有特殊设置的话.默认名为origin
.如果你是使用了clone
指令克隆的一个远程仓库的话,那么Git会默认设置成origin
. -
branch-name
是你的分支名称, 如果你是在默认分支上, 而你有没有特别命名的话, 默认名为master
-
git push [remote-name]
如果你所在分支于远程仓库分支存在标记跟踪关系, 则可以省略后面的[branch-name]
,git会默认推送当前所在分支到远程仓库所在分支git push
如果你所在分支仅存在一条标记追踪关系, 则[remote-name]
、[branch-name]
都可以省略. git会默认推送当前分支到对应的远程仓库分支.
我们通常的提交操作可以使用如下流程指令:
git status
查看状态,如果有新增文件 则执行git add .
git commit -a -m [提交信息]
提交到本地仓库- 如果需要推送到远程仓库则执行
git push
(在你没有更改默认remote-name
以及分支名的情况下)git status
查看是否完整成功提交代码.
写在最后
本篇文章所总结的内容, 均是从GitBook中学习总结的, 如果你想系统而仔细的去了解git的话.还是推荐你去用GitBook中看一下.
如果这篇文章真的能够帮助到了看文章的你的话, 那将是对我来说最好的鼓励了, 还希望你能够用一个小心心告诉我哦.
持续更新ing....