git

Git教程

Posted by eye on 04-19,2023

浅显易懂的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