文章目录
前言
git是目前最流行的分布式(Distributed)版本控制系统。学习一下以便工作之需。相关视频链接:Git Tutorial for Beginners: Learn Git in 1 Hour。Git网站:https://git-scm.com
Git简介
为何选择Git
git是目前最流行的分布式(Distributed)版本控制系统。免费,开源,传输速度超快,并且可以拓展,同时git开分支和合并分支都很简单。几乎所有的软件工程师都具备Git的操作技能。
如何使用Git
方法一:使用命令行,这是最快,有时也是最简单的方法。
方法二:代码编辑器&IDE内置的Git基本功能支持,给不喜欢命令行的人准备的,比如VSCode中的GitLens。
方法三:图形用户界面,专为Git打造的。比如GitKraken,Sourcetree。到Git官网可以找到这些工具的完整列表:https://git-scm.com/downloads/guis。
为什么一定要学命令行
GUI Tools总是有限制,要获取完整Git操作你还是需要用命令行。
Git BASH
对于Windows用户,安装Git的同时也会得到一个叫Git BASH的程序,这个程序模拟LINUX和UNIX环境下的GIT命令,推荐使用。
获取帮助
可以google查找官方文档,也可以在终端输入一下代码
git 在这里输入你想查询的命令 --help
#or
git 想要查询的命令 -h
#example:
git config --help
--help
会给你命令的完整文档,-h
会给你一个简短的总结。
配置Git
Git级别
在配置之前,你需要知道,Git有三个级别:
System:最高级别,在这个级别的设置适用于所有用户。
Global:在这个级别的设置适用于当前用户的所有存储库。
Local:在这个级别的设置适用于当前存储库。
第一次使用Git
第一次使用Git,我们需要指定姓名,邮箱,默认编辑器已经Git要如何处理行尾。
git config --global user.name "Xu Tao"
git config --global user.email xutao@somekindemail.com
git config --global core.editor "code --wait"
git config --global core.autocrlf true
默认编辑器设置为"code",是指VSCode。
Windows系统中,行尾是回车符’\r’和换行符’\n’,相比之下macOS和Linux只有’\n’。所以我们要启用Core.autocrlf,让系统自动管理行尾以便协调不同平台的共同开发,如果现在使用的是macOS或者Linux平台,设置core.autocrlf
为input
。
初始化存储库
选择工作路径
通过cd
切换工作目录
cd 这里写工作目录
#example:
cd C:/Users/xutao
创建项目目录
通过mkdir
创建工作目录
mkdir 这里写命名
#example:
mkdir Moon
初始化存储库
在我们第一次将文件放到项目目录中前,我们需要先通过init
初始化git存储库
git init
初始化之后,项目目录中将拥有一个隐藏的.git文件夹,这是git用来进行版本控制的文件,我们不用在意其细节。如果删除该.git文件夹,我们将丢失git存储库的项目历史。
Unix/Linux/git文件操作命令简介
删除文件
使用rm
命令删除本地文件。这是一个Unix命令。
git rm file1.txt
在git中,更好的方法是使用git rm
命令,这个命令会从工作目录和暂存区两个地方移除文件。
修改文件内容
使用echo
命令修改文件。
echo hello world > file1.txt
echo ! >> file1.txt
以上代码将echo
后面的文字写入>/>>
后面的文件中,其中>
为覆写,>>
为附加到后面。如果没有找到同名的现成文件,会帮你新建一个,刚刚新建的文件是未追踪的。
修改文件名
Unix使用mv
命令修改文件名,mv
还可以用来移动文件目录。当我们修改文件名时,对于存储库来说如同删掉了一个旧文件并添加了一个新文件,虽然它们的内容是一样的。
mv file1.txt main.cpp
git提供了git mv
来方便我们修改文件名的同时添加至暂存区。
git mv file1.txt main.cpp
Git工作流
暂存区(Staging Area)
现在,我们有了项目目录和git存储库,按照视频主的说法,那个隐藏的.git文件就是我们的git存储库,当然存储库可以在本地也可以在远程服务器。
每天,当我们对项目进行开发以后,我们将对项目的修改提交给存储库。在git中,我们还有一个额外的中间步骤,称为暂存区(Staging Area)或索引(Index)。我们提交的更改首先会放到暂存区,让我们可以对更改做出检查,如果一切正常,我们才将更改正式放到存储库。如果某些更改不应该发生,我们可以将这些更改拿出暂存,并且可以提交为下一次更改。
添加文件到暂存区
当我们向工作目录中添加了文件file1,可以使用add
命令将file1添加到暂存区。使用*
来将全部的特定后缀文件添加到暂存区,或者使用.
来递归添加整个目录,请注意,以上批量添加很可能会使得很多不需要添加的文件也被添加进去。
git add file1.txt
#or
git add file1.txt file2.txt
##or
git add *.txt
#or
git add .
将文件从暂存区提交到存储库
如果没有问题,使用commit
命令将这个文件从暂存区提交到存储库。commit -m
后面跟一个字符串作为对本次提交的说明。文件提交到存储库以后,git会开始对该文件进行追踪。
git commit -m "Commit file1"
有时需要对本次提交进行详细说明,一个字符串可能不够。这时可以直接git commit
,这样会打开你的默认编辑器,你可以在默认编辑器中写提交说明。
git commit
注意了,暂存区中的文件提交以后并不会从暂存区中消失,你可以将暂存区作为对工作目录上一次使用add
命令时状态的暂存。之后工作目录如果有更改(增删改),一样使用add
命令更新暂存区。
提交不需要每次修改一点点代码就提交,也不要写个两三天再提交,提交应该作为项目生产过程中的“存档点”。一般来说,一天提交5-10次差不多。同样的,提交要在逻辑上分开,也就是说如果在一次修改中你修了一个BUG,并且添加了一些功能,最好是修改BUG提交一次,新功能提交一次,而不是两个不同类型的修改一次提交。
跳过暂存区
有时我们不一定要先添加到暂存区再提交,当你100%确定你的代码不需要审查时,使用git commit -a -m
来跳过暂存区直接提交所有修改的文件。
查看git状态
使用git status
查看git状态,其中红色字体表明没有提交到暂存区的文件更改,绿色字体表明文件更改提交到了暂存区。如果觉得git status
很啰嗦,可以使用git status -s
来查看短状态。
差异比较
可以使用git diff
命令查看文件在暂存区和工作区的差异,或者git diff --staged
来查看上一次提交的内容和暂存区之间的差异。
git diff
#or
git diff --staged
我们还可以使用可视化工具达成这一目的。在这里我们将使用VSCode。首先设置diff.tool。
git config --global diff.tool vscode
git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
接下来,我们就可以使用diff工具了
git difftool
#or
git difftool --staged
忽略文件
有时,工作目录下的有些文件不需要分享给其它人,比如个人的工作日志。这时我们可以通过添加一个叫.gitignore的文件,这个文件就叫.gitignore。将你想要让git忽略的文件或目录写到.gitignore中。
echo logs/ > .gitignore
需要注意的是,如果一个文件/目录已经被添加到存储库了,这时你再将其加入到.gitignore,git是不会忽略那个文件的,你只能在将文件添加到存储库之前将其添加到.gitignore才有效,原因是如果文件/目录已经提交了,git就已经开始追踪它了。如果出现了上述情况,将文件/目录从暂存区中删除就可以进一步删除存储库中的该文件。
git rm --cached -r bin/
git的提交中有什么信息
git的每一个提交包含:
- 一个由git生成的唯一的标识符ID
- 本次提交的修改内容信息
- 提交时间/日期
- 提交者信息
- 当时项目的完整快照,用于快速回到项目的先前状态
查看所有历史提交
使用git log
来查看所有历史提交,或者使用git log --oneline
来得到一个简短的历史提交摘要,甚至可以加上--reverse
来获得反向的摘要。
查看具体提交
使用git show
后面跟上提交的标识符(只需要标识符中独特的一部分)或者头部指针来查看某个提交的具体信息。下面代码演示如何查看倒数第二个提交
git show 9e5d #假如这是倒数第二个标识符的独特部分
#or
git show HEAD~1 #头部指针向后退1位也就是倒数第二个提交
在版本之后使用:[文件名]
命令查看文件在给定版本的具体内容(就是该文件在给定版本时是什么样自)。
git show HEAD~1:file1.txt
如果想查看某个版本提交中的所有文件和目录,使用git ls-tree
命令。
git ls-tree HEAD~1
对于查找到的文件和目录,也可以使用git show
查看。
对git show
做一个总结,show
可以查看的信息有:提交、files(Blobs)、Trees(Directories)、Tags。
撤销add命令
老版本git使用git reset
撤销git add
命令,新版本可以使用git restore --staged
。
git restore --staged file2.txt
restore
是如何做到这一点的呢。restore
命令从下一个环境(next environment)获得拷贝。下一个环境是最近的一次向存储库的提交,所有基本上restore
做的就是将文件上一次提交时的内容放回暂存区,这样就覆盖掉了最新一次的add
命令。如果一个文件是新建的,第一次添加到暂存区,还没有添加到存储库中过,使用restore
命令会直接将该文件从暂存器中移除。
丢弃本地更改
使用git clean
命令批量删除新添加的本地文件
git clean -fd
将文件恢复到早期版本
要恢复文件,我们可以使用git restore
命令撤销某次提交。
git restore --source=HEAD~1 file1.txt
主线(master)&分支(branch)
当你开发新东西时,你担心新东西会导致原来本来能好好运行的版本出现问题。通常情况下你会将老版本复制一份,再在其中一份上做实验。git提供的分支就可以帮助你做这件事。或者,你有一个团队共同开发一个项目,你就可以将项目划分为多个分支来将任务分配给不同的开发者。
要在分支上工作,首先我们需要创建一个新分支。下面代码演示了如何创建一个叫develop的分支。你可以在任何分支下创建分支,新分支会以创建它的分支为参考。
git branch develop
现在分支有了,使用以下代码切换到分支上工作。接下来,在分支上就可以大胆开发新功能。
git checkout develop
当你完成分支上的工作以后,一般都需要将分支合并(Merging)到主线,或者创建他的分支。
#feature来自分支develop
git merge feature
git数据存储方式简介
前面提到,git会存储当时项目的完整快照,实际上git的数据存储相当的高效,git会对数据进行压缩,并且不会存储重复的内容。当然,git具体如何存储数据,这个作为使用者可以不用关心。正是因为git的提交直接存储了当时项目的完整快照,才能够做到快速回到项目的先前状态。如果存储的是每一次的更改,返回先前状态则需要进行计算。
最后
很遗憾,第一个教程只讲了一小时内容,还有4小时高级内容付费才能看。