浅显易懂的Git教程
安装Git
在Linux上安装Git 首先,你可以试着输入git,看看系统有没有安装Git .
用Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装,非常简单。
sudo apt-get install git
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "git user name"
$ git config --global user.email "[email protected]"
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库
首先,选择一个合适的地方,创建一个空目录:
$ mkdir git.test
$ cd git.test
$ pwd
/home/git/code/git.test
通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示: git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main'、'trunk' 和 'development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示: git branch -m <name>
已初始化空的 Git 仓库于 /home/git/code/git.test/.git/
现在我们编写一个readme.md文件,内容如下:
echo "git tutorial " > readme.md
用命令git add告诉Git,把文件添加到仓库:
$ git add readme.md
用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "write a readme file"
[master (根提交) b442473] write a readme file
1 file changed, 1 insertion(+)
create mode 100644 readme.md
时光穿梭
我们已经成功地添加并提交了一个readme.md文件,是时候继续工作了,我们继续修改readme.md文件:
echo "very good tutorial" >> readme.md
运行git status命令看看结果:
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: readme.md
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git status命令可以让我们时刻掌握仓库当前的状态
虽然Git告诉我们readme.md被修改了,但如果能看看具体修改了什么内容,自然是很好的。
所以,需要用git diff这个命令看看:
$ git diff
diff --git a/readme.md b/readme.md
index 11bd68e..72d20e3 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
git tutorial
+very good tutorial
知道了对readme.md作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add:
git add readme.md
在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:
$ git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
修改: readme.md
下一步,就可以放心地提交了:
$ git commit -m "add status"
[master a0bb7aa] add status
1 file changed, 1 insertion(+)
提交后,我们再用git status命令看看仓库的当前状态:
$ git status
位于分支 master
无文件要提交,干净的工作区
版本回退
版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:
$ git log
commit a0bb7aa58afc3cef9d3f99ed9fab85c866626994 (HEAD -> master)
Author: gittest <[email protected]>
Date: Wed Apr 19 14:26:23 2023 +0800
add status
commit b4424732481218279d19b95593c203522b0e1c99
Author: gittest <[email protected]>
Date: Wed Apr 19 14:17:41 2023 +0800
write a readme file
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在,我们要把当前版本append GPL回退到上一个版本,就可以使用git reset命令:
$ git reset --hard HEAD^
HEAD 现在位于 b442473 write a readme file
当你用$ git reset --hard HEAD^回退到上一个版本时,再想恢复到当前,就必须找到当前的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
$ git reflog
b442473 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
a0bb7aa HEAD@{1}: commit: add status
b442473 (HEAD -> master) HEAD@{2}: commit (initial): write a readme file
再想恢复到当前
$ git reset --hard a0bb7aa
HEAD 现在位于 a0bb7aa add status
$ git log
commit a0bb7aa58afc3cef9d3f99ed9fab85c866626994 (HEAD -> master)
Author: gittest <[email protected]>
Date: Wed Apr 19 14:26:23 2023 +0800
add status
commit b4424732481218279d19b95593c203522b0e1c99
Author: gittest <[email protected]>
Date: Wed Apr 19 14:17:41 2023 +0800
write a readme file
撤销修改
使用git checkout – file可以丢弃工作区的修改:
git checkout -- readme.md
git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令
删除文件
$ rm test.txt
$ git add .
$ git commit -m "remove test"
[master a4dfae1] remove test
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
从版本库中删除文件,那就用命令git rm删掉,并且git commit:
$ git rm test.git.txt
rm 'test.git.txt'
$ git commit -m "remove git.txt"
[master aad489b] remove git.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.git.txt
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
工作区和暂存区
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的/home/git/code/git.test文件夹就是一个工作区
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以认为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
远程仓库
先注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。
ssh-keygen -t rsa -C "[email protected]"
第2步:登陆GitHub,打开“Account settings”
“SSH Keys”页面点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
添加远程库
登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
在Repository name填入 testgit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
现在,我们根据GitHub的提示,在本地的git.test仓库下运行命令:
$ git remote add origin [email protected]:bestgit/git.test.git
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样, 从现在起,只要本地作了提交,就可以通过命令
$ git push origin master
删除远程库
删除远程库,可以用git remote rm name命令。使用前,建议先用git remote -v查看远程库信息:
$ git remote -v
比如删除origin:
$ git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。
从远程库克隆
用命令git clone克隆一个本地库:
$ git clone [email protected]:bestgit/testok.git
分支管理
创建与合并分支
首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
切换分支
$ git checkout master
合并分支
$ git merge dev
删除分支
$ git branch -d dev
解决冲突
$ vim confilct.txt
$ git add confilct.txt
$ git commit -m "conflict fixed"
标签管理
在Git中打标签非常简单,首先,切换到需要打标签的分支上 使用命令git tag <name>就可以打一个新标签:
$ git tag v1.0
用命令git tag查看所有标签:
$ git tag
找到历史提交的commit id,然后打标签
$ git log --pretty=oneline --abbrev-commit
$ git tag v2.0 a4dfae1
可以用git show <tagname>查看标签信息
git show v2.0
创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" aad489b
标签打错了,也可以删除:
$ git tag -d v0.1
推送某个标签到远程,使用命令git push origin <tagname>
$ git push origin v1.0
推送全部尚未推送到远程的本地标签
$ git push origin --tags
标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
$ git tag -d v0.9
然后,从远程删除。删除命令也是push
$ git push origin :refs/tags/v0.9
忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
https://github.com/github/gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
搭建Git服务器
第一步,安装git:
$ sudo apt-get install git
第二步,创建一个git用户
$ sudo adduser git
第三步,创建证书登录:
把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/repository/sample.git,在/repository目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区, 然后把owner改为git
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
修改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
第六步,克隆远程仓库:
通过git clone命令克隆远程仓库了,在各自的电脑上运行
$ git clone git@server:/repository/sample.git