编写软件需要软件版本控制,我原来用tortoise svn, 后来不知何故,
数据没有了。我问朋友,哪个好,他说他在用git.
这样,我就开始学习使用git, 并看git 的帮助文件。
git add
git commit
我最开始就是网上查找资料,常用命令,我开始学习的网站是
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
后来,我发现其实安装git 的时候,就安装了帮助文件。
帮助文件在哪呢? git --man-path 就会显示出来,注意man前是2个"-"
我的显示是:c:\program files\git\mingW64\share\man
在这个目录里你可以看到各种帮助文件,简单教程,常用命令,各命令详解,不过都是英文的,估计中文版就是中文的吧,我可以看英文,就无所谓。
创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
mkdir learngit
cd learngit
pwd
/Users/michael/learngit
第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录
这里有个问题,我现在有个目录liwenz, 我想管理其下的源代码,那我怎么办?
答案就是在这个liwenz 目录下运行git init
cd liwenz
git init
把文件添加到版本库
第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m “wrote a readme file”
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
运行git status命令看看结果
git diff顾名思义就是查看difference
版本回退
git log命令显示从最近到最远的提交日志
现在我们启动时光穿梭机,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
回退到上一个版本,就可以使用git reset命令:
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
在Git中,总是有后悔药可以吃的。当你用 git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
工作区和暂存区
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
每次修改,如果不add到暂存区,那就不会加入到commit中。
管理修改
第一次修改 -> git add -> 第二次修改 -> git commit
那么第二次修改就没有被保存
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
好,这样就把第二次修改提交了,保存了。
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
在Git中,删除也是一个修改操作,如果删除一个文件,
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
恢复文件
$ git checkout test.txt
这个操作等同 $ git checkout HEAD test.txt
就是当前最新版本,当然也可以
$ git checkout HEAD~2 test.txt 当前退2次的版本
远程仓库
在继续阅读后续内容前,请自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
网上备份可以用github
本地备份怎么用了,我查了很多都说用git clone
后来终于找到本地备份应该用 git bundle
https://git-scm.com/docs/git-bundle
git-bundle - Move objects and refs by archive
SYNOPSIS
git bundle create
git bundle verify
git bundle list-heads […]
git bundle unbundle […]
我还学会了一个新命令,git submodule
Inspects, updates and manages submodules.
A submodule allows you to keep another Git repository in a subdirectory of your repository. The other repository has its own history, which does not interfere with the history of the current repository. This can be used to have external dependencies such as third party libraries for example.