Git 是什么?Git 是目前世界上最先进的分布式版本控制系统。 那什么是版本控制系统呢?我们都有过用 Word 写论文的经历,有时候我们想删除某个段落,但是又担心后续用到找不回来了,那么怎么办呢?我们通常会将当前文档另存为一个文档,然后接着修改文档,随着修改次数的增加,我们的文档会越来越多,当过了一个月后,我们再想找回某个被删除的的段落,但是记不清楚在哪个文档了,只好一个一个去找,甚是麻烦。 而 Git 可以帮我们自动记录每次的改动,并且可以和其他人共同协作,如果想查看某次改动,只需要在打开 Git 历史记录,岂不是很方便。
一、Git 和 SVN 的比较
1. SVN
SVN是集中式的版本控制系统。版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,活干完了,再推送给中央服务器。 集中式版本控制系统最大的缺点就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个几 MB 的文件就需要好几分钟。
2. Git
Git是分布式的版本控制系统。分布式版本控制系统没有中央服务器,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。如果你和另一个人同时修改了文件A,只需把各自的修改推送给对方,就可以互相看到对方的修改了。 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了没事儿,从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
二、安装Git
1. linux
sudo apt-get install git
./config、make、sudo make install这几个命令安装就好了。2. macos
使用 homebrew
首先我们需要安装homebrew,具体方法请参考 homebrew 的文档:http://brew.sh/。
然后,输入如下命令即可安装完成
brew install git
使用 MacPorts
首先,我们需要安装MacPorts,具体方法请参考:https://www.macports.org/install.php。
然后,输入如下命令即可安装完成
sudo port install git
通过 Xcode
从 AppStore 安装 Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
3. Windows
4. 安装后的配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
三、初始化版本库
创建版本库也非常简单。
首先,我们需要找一个目录,比如 Users/casey/workspace/gitDemo然后,执行如下命令即可
git init
.git的目录,这个目录是 Git 来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把 Git 仓库给破坏了。四、两步提交法
用命令 git add告诉 Git,把文件添加到仓库
git add readme.txt
注意:如果你想添加当前目录所有改动的文件到 Git,可以使用 git add .
用命令 git commit告诉 Git,把文件提交到仓库
git commit -m "add a readme file"
-m参数后面输入的是本次提交的说明,可以输入任意内容,这样你就能从历史记录里方便地找到改动记录。
add,commit一共两步呢?因为 commit 可以一次提交很多文件,所以你可以多次 add 不同的文件。比如:git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files"
五、时光隧道
1. git status 和 git diff
I modified a readme.txt file
git status

如果能看看具体修改了什么内容,那就更好了。这时候就要用到
git diff这个命令了:git diff readme.txt

git diff顾名思义就是查看 difference,显示的格式正是 Unix 通用的 diff 格式。从以上结果可以看到,我们在 readme.txt 中添加了一行文本:
I modified a readme.txt file。接着,如果确认内容无误后,我们可以继续使用上一个步骤中的两步提交法,提交修改的内容。
提交后,我们再用
git status命令看看仓库的当前状态:git status

小结
git status可以查看当前仓库状态git diff可以查看当前修改的提交内容
2. 版本回退
I modified a readme.txt file again
截止目前,我们已经将 readme.txt 修改两次了,分别称为版本1和版本2。
版本1:add a readme file
I modified a readme.txt file
I modified a readme.txt file again
git loggit log

git log命令显示从最近到最远的提交日志。如果嫌输出信息太多,可以试试加上--pretty=oneline参数:git log --pretty=oneline

首先,确定回退的版本
Git 必须知道当前版本是哪个版本,在 Git 中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写100个^数不过来,所以写成HEAD~100。然后,使用 git reset进行回退
比如,我们输入如下命令:
git reset --hard HEAD^
cat readme.txt
I modified a readme.txt file
我们再用
git log看下当前 Git 仓库的状态。git log

别担心,在 Git 中,总是有后悔药可以吃的。如果我们回退到了上个版本,再想回到最新版本,我们只需找到最新版本的
commit id就可以了。Git 贴心的为我们提供了一个命令git reflog用来记录你的每一次命令:git reflog

然后我们再使用如下命令,就可以恢复到最新版本了。
git reset --hard 862c07a
小结:
HEAD指向的是当前版本,使用git reset --hard commit_id可以在不同的历史版本中任意穿梭。穿梭前,用 git log可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用 git reflog查看命令历史,以便确定要回到未来的哪个版本。
3. 工作区和暂存区
工作区(Working Directory)
就是你在电脑里的目录,比如我的 gitDemo 文件夹就是一个工作区版本库(Repository)
工作区有一个隐藏目录.git,就是Git的版本库。
Git 的版本库里存了很多东西,其中最重要的就是称为stage的暂存区。暂存区(Stage)
当我们用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
当我们用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建 Git 版本库时,Git 自动为我们创建了一个 main 分支,所以,现在,git commit就是往 main 分支上提交更改。
4. 撤销修改
我们可以用
git restore这个命令来撤销本次修改。git restore readme.txt
如果说,我们不仅修改了内容,还将修改的内容添加(git add)到暂存区了,但是还没提交,这时想撤销怎么办?
我们可以用
git restore --staged这个命令来撤销添加到暂存区的操作。git restore --staged readme.txt
git restore命令来撤销修改的内容。git restore readme.txt
5. 删除文件
test.txt到 Git。然后我们在文件系统中删除这个 test.txt 文件。
现在你有两个选择:
一是确实要从版本库中删除该文件,那就用命令 git rm或者git add删掉,并且git commit。这样 test.txt 就从 Git 仓库中删除了。二是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。
git restore test.txt
六、远程仓库
Git 是分布式版本控制系统,同一个 Git 仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
实际工作中,我们会找一台服务器,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
如果大家听说过一个叫
GitHub网站,那就不难理解了。这个网站就是提供 Git 仓库托管服务的,所以,只要注册一个 GitHub 账号,就可以免费获得 Git 远程仓库。实际工作中,我们会搭建 GitLab 作为公司的远程仓库。有了远程仓库,再也不用担心我的硬盘了,我们可以随时随地的修改我们的代码了
1. 添加远程仓库
gitDemo,又想在 GitHub 创建一个 Git 仓库,名字也叫 gitDemo,并且让这两个仓库进行远程同步。我们可以在本地的 gitDemo 目录下执行如下命令,将本地仓库和远程仓库同步:
git remote add origin git@github.com:eyesmoons/gitDemo.git
下一步,就可以把本地库的所有内容推送到远程库上:
git push -u origin main
由于远程库是空的,我们第一次推送 main 分支时,加上了 -u参数,Git 不但会把本地的main 分支内容推送的远程新的 main 分支,还会把本地的 main 分支和远程的 main 分支关联起来,在以后的推送或者拉取时就可以简化命令。
2. 从远程仓库克隆
现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
当我们在 Github 中创建了一个仓库,我们可以使用如下命令克隆仓库到本地:
git clone git@github.com:eyesmoons/gitDemo2.git
七、分支管理
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
1. 创建和合并分支
我们创建dev分支,然后切换到dev分支:
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
git branch命令查看当前分支git branch
git branch命令会列出所有分支,当前分支前面会标一个*号。
git checkout main
git merge dev
git branch -d dev
小结:
查看分支: git branch创建分支: git branch branchName切换分支: git checkout branchName创建并切换分支: git checkout -b branchName合并某分支到当前分支: git merge branchName删除分支: git branch -d branchName
2. 解决冲突
git merge合并分支时,有可能出现冲突,这时候需要我们手动解决冲突,然后再重新提交。Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,<<<<<<< 和 ======= 之间是远程仓库中的内容,======= 和 >>>>>>> 是我们本地修改的内容。我们修改后保存。
然后再使用两步提交法重新提交修改,即可解决冲突。
3. bug分支
当你接到一个修复一个代号101的 bug 的任务时,很自然地,你想创建一个分支 issue-101 来修复它,但是,等等,当前正在 dev 上进行的工作还没有提交。并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个
stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:git stash
git stash pop
git stash apply stash@{0}
往期推荐