官网的使用说明
- 学习怎么安装、使用、搭建服务器
- 学习地址
1 创建本地仓库,并链接远程仓库
1.1 安装 GIT for Windows
-
官网下载地址:https://git-scm.com/
1.2 什么是版本库呢?
版本库又名仓库,英文名 repository
,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git
都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
1.3 练习
1.3.1 创建版本库
# 创建目录,路径不可以有中文
$ mkdir learngit
$ cd learngit
# 把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬间 Git
就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository
),当前目录下会多一个 .git
的目录,这个目录是Git来跟踪管理版本库的。如果没有看到 .git
目录,那是因为这个目录默认是隐藏的,用 ls -ah
命令就可以看见。
1.3.2 添加远程仓库
# 以码云为例
# 项目地址形式为: https://gitee.com/xxx/xxx.git 或者 git@gitee.com:xxx/xxx.git
$ git remote add origin <你的项目地址>
1.3.3 把本地最新修改推送至码云
# git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin master:master
# 如果本地分支和原程分支名一样,则可以省略冒号后面的内容
$ git push origin master
1.3.4 同步远程厂库到本地
# 当远程仓库有更新的时候,就可以使用这个命令来同步最新的内容到本地
$ git pull origin
1.3.5 显示远程厂库的状态
$ git remote show origin
* remote origin
Fetch URL: https://e.coding.net/weidongshan/01_all_series_quickstart.git
Push URL: https://e.coding.net/weidongshan/01_all_series_quickstart.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
如果显示的是 up to date 则本地与远程厂库代码一样**,**显示的是 local out of date 就是有更新了。
1.3.6 创建 .gitignore
文件在仓库目录下,可以添加忽略的目录和文件
2 参数配置
2.1 查看与修改用户名、邮箱
2.1.1 用户名和邮箱的作用
- 用户名和邮箱地址相当于你的身份标识,是本地
Git
客户端的一个变量,不会随着Git
库而改变 - 每次
commit
都会用用户名和邮箱纪录 github
的contributions
跟你的邮箱是有关联的
2.1.2 查看自己的用户名和邮箱地址
-
用户名
$ git config user.name
-
邮箱
$ git config user.email
2.1.3 修改自己的用户名和邮箱地址
-
用户名
$ git config --global user.name "xxx"
-
邮箱
# --global: 表示全局的,如果只修改当前用户不要这个参数 $ git config --global user.email "xxx"
2.2 忽略权限的修改
$ git config core.filemode false
3 常用命令
3.1 代码提交推送
3.1.1 添加文件到暂存区
-
查看工作去状态
$ git status
-
把文件添加到暂存区
$ git add xxx
3.1.2 暂存区修改提交到本地仓库
-
单行注释
# xxx 是注释,注明本次修改的目的 $ git commit -m "xxx"
-
多行注释
# 两行为例 # 1.第一行 $ git commit -m "xxx # 2.按下Enter输入第二行 xxx" # 3.按下Enter提交
-
直接添加修改到本地仓库
# 省略了 git add 这一步 $ git commit -am "xxx"
3.2 显示提交
3.2.1 显示提交记录
-
查看当前仓库
$ git log
-
查看其它仓库
# 后面追加仓库名字 $ git log xxx
-
追筛选参数
-
按数量
# 显示最新的 x 条 commit $ git log -x
-
按日期
# 显示 年-月-日 日期后的 commit $ git log --after="年-月-日" # 显示 年-月-日 日期前的 commit $ git log --before="2022-10-13" # --after 和 --before 可以配合使用
-
按作者
# 显示 relax 的 commit # 可以使用 | 多个作者,也可以用 email $ git log --author="relax"
-
按
commit
描述# 显示包含 xxx 的 commit # 可以使用 -i 忽略大小写 $ git log --grep="xxx"
-
按文件
# 显示 xxx 文件相关的 commit # xxx 需要时相对于版本库的相对路径 $ git log xxx
-
按分支
# 显示 xxx 分支的 commit # -- 可以省略 $ git log -- xxx
-
按内容
# 显示 xxx 内容的修改,一般时删除和增加 # 换成 -G 是使用正则表达式 # 比较费时间 $ git log -S"xxx"
-
按范围
# 显示某个范围的 commit $ git log <since>..<until> # 使用 branch 做为 range 参数的时候. 能很方便的显示 2 个 branch 之间的不同 # 这个 range 包含了在 dev 有而在 master 没有的所有 commit $ git log master..dev
-
按标签
tag
# 显示 xxx 标签之前的 commit $ git log xxx # 显示 xxx 标签之前的 commit(不包含 xxx 标签的 commit) $ git log xxx..
-
按
commit
# 显示 xxx commit 之前的 commit,包含 xxx 的 commit $ git log xxx # 显示 xxx 和 yyy 之间的 commit,包含 xxx 和 yyy 的 commit $ git log xxx yyy # 同上,但是不包括 xxx 的 commit $ git log xxx..yyy
-
3.2.2 查看提交的修改
-
查看某一次提交的修改
$ git show commitId
-
查看某次
commit
中具体某个文件的修改$ git show commitId fileName
3.3 补丁文件
3.3.1 生成补丁
-
commitId
之后的提交生成补丁$ git format-patch commitId
-
commitId
和之前的提交生成补丁$ git format-patch commitId -n # n = 1 当前 commitId 的提交 # n > 1 当前 commitId 和之前的 n - 1 次提交
-
两次提交之间生成补丁
$ git format-patch commitId1 commitId2
3.3.2 打补丁
# p1 忽略第一个‘/’前的目录
# pn 忽略第n个‘/’前的目录
# 加上 -R 就是卸载补丁
$ patch -p1 < xxx.patch
3.4 diff
文件
3.4.1 生成 diff
文件
-
创建
diff
文件$ git diff commitId1 commitId2 > xxx.diff
-
比较文件夹的不同
$ git diff <dir1> <dir2> > change.diff
-
查看文件的修改
$ git diff <file>
3.4.2 打补丁
# p1 忽略第一个‘/’前的目录
# pn 忽略第n个‘/’前的目录
# 加上 -R 就是卸载补丁
$ patch -p1 < xxx.diff
3.5 .gitignore
3.5.1 解决 .gitignore
未生效
有时候,.gitignore
会对部分文件/文件夹失效,大概原因是由于新创建的文件已经出现在 git
本地仓库的缓存,所以 .gitignore
就失效了解决办法就是清空一下 git
仓库的缓存,重新提交一次就好了
# --cached: 表示只删除 git 索引,不删除原文件
# .: 指删除当前目录下的所有文件,可以替换为指定的目录
$ git rm -r --cached .
$ git add .
$ git commit -m "update .gitignore"
3.5.2 忽略已经被厂库管理的文件
在一些情况下,我们希望不在对一些文件的修改进行管理,但又不想删除文件。可以这样做:
-
删除
git
文件索引# --cached: 表示只删除 git 索引,不删除原文件 # -r: 表示递归 $ git rm -r --cached <文件或者目录>
-
修改
.gitignore
# 打开.gitignore # 末尾添加上面文件或者目录 $ vim code/hdal/.gitignore
-
重新提交
# 添加到暂存区 $ git add .gitignore <文件或者目录> # 提交到仓库 $ git commit -m "xxx"
3.5.3 相关语法
-
不忽略
# 不忽略 .gitignore 文件 !.gitignore
-
目录
# 忽略 build 目录 /build # **表示匹配到多级目录 /**/*.o
3.6 其它
3.6.1 修改最新一次提交的注释
$ git commit --amend
3.6.2 显示所有远程仓库
$ git remote -v
origin ssh://root@192.168.1.122:9822/home/share/GitRepository/xxx.git (fetch)
origin ssh://root@192.168.1.122:9822/home/share/GitRepository/xxx.git (push)
4 版本回退
4.1 git reset
-
撤回
commit
操作,写的代码仍然保留$ git reset --soft HEAD^ # HEAD^的意思是上一个版本,也可以写成HEAD~1,如果你进行了2次commit,想都撤回,可以使用HEAD~2 # --soft 不删除工作空间改动代码,撤销commit,不撤销git add
-
其它参数
- –mixed
- 不删除工作空间改动代码,撤销 commit,并且撤销 git add 操作
- 这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的
- –hard
- 删除工作空间改动代码,撤销 commit,撤销 git add
- 完成这个操作后,就恢复到了上一次的commit状态
- –mixed
4.2 git revert
# 使用一次新的 commit 撤销之前的 commit
$ git revert commitId
自动生成注释
Revert "修改注释: 04_input_read_select.c"
This reverts commit 41a8ad026c3dd152020ec3eafbd568d2e82f4094.
5 仓库分支
5.1 本地分支
5.1.1 查看分支
-
查看本地分支
$ git branch
-
查看远程分支
$ git branch -r
-
查看所有分支
$ git branch -a
5.1.2 基于当前仓库创建分支
-
创建分支
$ git branch <name>
-
切换分支
$ git checkout <name>
-
创建并切换到分支
$ git checkout -b <name>
5.1.3 小结
-
删除分支
$ git branch -d <name>
-
合并某分支到当前分支
$ git merge <name>
我们常常在遇到问题后会选择先创建分支,然后在分支上解决问题,最后再把解决问题的分支合并到主要分支
-
修改分支名字
$ git branch -m oldName newName
5.2 远程分支
5.2.1 查看所有分支
$ git branch -a
* master # 本地分支,关联的是origin/master
remotes/origin/HEAD -> origin/master # 远程分支,只有一个主分支
remotes/origin/master
5.2.2 创建远程分支
-
查看所有分支
$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master
-
创建本地分支
$ git branch dev $ git branch -a dev * master remotes/origin/HEAD -> origin/master remotes/origin/master
-
提交本地分支到远程厂库
$ git push origin dev $ git branch -a dev * master remotes/origin/HEAD -> origin/master remotes/origin/dev # 远程dev分支 remotes/origin/master
-
基于远程分支创建本地分支
# 首先克隆了整个厂库 $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/dev # 远程厂库dev分支 remotes/origin/master $ git checkout -b dev-test origin/dev # 重新定义一个名,如果想要同名,可以使用 git checkout -t origin/dev $ git branch -a * dev-test # 本地分支 master remotes/origin/HEAD -> origin/master remotes/origin/dev remotes/origin/master
5.2.3 小结
-
查看分支跟踪的远程分支
$ git branch -vv
-
修改本地分支正在跟踪的远程分支
$ git branch -u <origin/branchname> # 或者把 -u 改为 --set-upstream-to
-
解除本地分支与远端分支的关联
$ git branch --unset-upstream <branchname>
-
删除远程分支
# 先解除本地分支与远程分支的关联 $ git branch --unset-upstream <branchname> # 再删除远程分支 $ git push origin --delete <branchname>
6 打标签
Git
可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点( v1.0
、v2.0
等等)。
6.1 查看标签
-
查看标签
$ git tag
-
查看相关的标签(v1.8.5)
$ git tag -l "v1.8.5*"
-
查看标签详细信息
$ git show <tagname>
6.2 打标签
-
打标签
# 默认标签是打在最新提交的commit上的 $ git tag <name>
-
对历史的提交打标签
$ git tag <name> <commitId>
6.3 删除标签
-
删除标签**(还未推送到远程仓库)**
# 创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除 $ git tag -d <name>
-
删除标签**(已经推送到远程仓库)**
-
先删除本地
$ git tag -d <name>
-
远程厂库删除
$ git push origin :refs/tags/<name>
-
要看看是否真的从远程库删除了标签,可以到远程仓库去看
-
6.4 小结
-
推送某个标签到远程
$ git push origin <name>
-
推送全部尚未推送到远程的本地标签
$ git push origin --tags
7 远程厂库和本地厂库
7.1 显示远程厂库的状态
$ git remote show origin
* remote origin
....
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
如果显示的是 up to date 则本地与远程厂库代码一样**,**显示的是 local out of date 就是有更新了。
-
推送到远程厂库
# git push <远程主机名> <本地分支名>:<远程分支名> $ git push origin master:master # 如果本地分支和原程分支名一样,则可以省略冒号后面的内容 $ git push origin master
-
同步远程代码到本地并合并
# 当远程仓库有更新的时候,就可以使用这个命令来同步最新的内容到本地 $ git pull origin
如果本地分支有新的提交,就会提示你填写合并理由
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
7.2 同步远程代码,然后合并
-
同步
$ git fetch origin
-
查看更新
$ git log origin/master
-
查看更新内容
$ git show origin/master <commitId>
-
合并分支
$ git merge origin/master master
如果本地分支有新的提交,就会提示你填写合并理由
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
8 git
补全不能使用解决
8.1 方法一
# 1.命令
$ source /etc/bash_completion.d/git
# 或者,ubuntu 是下面这个
$ source /usr/share/bash-completion/completions/git
# 2.永久有效,修改~/.bashrc,在文件结尾增加
if [ -f /usr/share/bash-completion/completions/git ]; then
. /usr/share/bash-completion/completions/git
fi
# 3.使能
$ source ~/.bashrc
8.2 方法二
# 1.下载软件
$ git clone https://github.com/markgandolfo/git-bash-completion.git
$ cp git-bash-completion/git-completion.bash ~/.git-completion.bash
# 2.永久有效,修改~/.bashrc,在文件结尾增加
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
# 3.使能
$ source ~/.bashrc
9 搭建远程 Git
仓库
9.1 在服务器上搭建 Git
9.1.1 创建裸仓库
在开始架设 Git
服务器前,需要把现有仓库导出为裸仓库——即一个不包含当前工作目录的仓库。 这通常是很简单的。 为了通过克隆你的仓库来创建一个新的裸仓库,你需要在克隆命令后加上 --bare
选项。 按照惯例,裸仓库的目录名以 .git
结尾,就像这样:
$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
现在,你的 my_project.git
目录中应该有 Git
目录的副本了。整体上效果大致相当于:
$ cp -Rf my_project/.git my_project.git
虽然在配置文件中有若干不同,但是对于你的目的来说,这两种方式都是一样的。 它只取出 Git
仓库自身,不要工作目录,然后特别为它单独创建一个目录。
9.1.2 把裸仓库放到服务器上
既然你有了裸仓库的副本,剩下要做的就是把裸仓库放到服务器上并设置你的协议。 假设一个域名为 git.example.com
的服务器已经架设好,并可以通过 SSH
连接, 你想把所有的 Git
仓库放在 /srv/git
目录下。 假设服务器上存在 /srv/git/
目录,你可以通过以下命令复制你的裸仓库来创建一个新仓库:
$ scp -r my_project.git user@git.example.com:/srv/git
此时,其他可通过 SSH
读取此服务器上 /srv/git
目录的用户,可运行以下命令来克隆你的仓库。
$ git clone user@git.example.com:/srv/git/my_project.git
如果一个用户,通过使用 SSH
连接到一个服务器,并且其对 /srv/git/my_project.git
目录拥有可写权限,那么他将自动拥有推送权限。
如果到该项目目录中运行 git init
命令,并加上 --shared
选项, 那么 Git
会自动修改该仓库目录的组权限为可写。 注意,运行此命令的工程中不会摧毁任何提交、引用等内容。
$ ssh user@git.example.com
$ cd /srv/git/my_project.git
$ git init --bare --shared
由此可见,根据现有的 Git
仓库创建一个裸仓库,然后把它放上你和协作者都有 SSH
访问权的服务器是多么容易。 现在你们已经准备好在同一项目上展开合作了。
值得注意的是,这的确是架设一个几个人拥有连接权的 Git
服务的全部—— 只要在服务器上加入可以用 SSH
登录的帐号,然后把裸仓库放在大家都有读写权限的地方。 你已经准备好了一切,无需更多。
下面的几节中,你会了解如何扩展到更复杂的设定。 这些内容包含如何避免为每一个用户建立一个账户,给仓库添加公共读取权限,架设网页界面等等。 然而,请记住这一点,如果只是和几个人在一个私有项目上合作的话,仅仅 是一个 SSH
服务器和裸仓库就足够了。
9.1.3 小型安装
如果设备较少或者你只想在小型开发团队里尝试 Git
,那么一切都很简单。 架设 Git
服务最复杂的地方在于用户管理。 如果需要仓库对特定的用户可读,而给另一部分用户读写权限,那么访问和许可安排就会比较困难。
9.1.4 SSH
连接
如果你有一台所有开发者都可以用 SSH
连接的服务器,架设你的第一个仓库就十分简单了, 因为你几乎什么都不用做(正如我们上一节所说的)。 如果你想在你的仓库上设置更复杂的访问控制权限,只要使用服务器操作系统的普通的文件系统权限就行了。
如果需要团队里的每个人都对仓库有写权限,又不能给每个人在服务器上建立账户,那么提供 SSH 连接就是唯一的选择了。 我们假设用来共享仓库的服务器已经安装了 SSH
服务,而且你通过它访问服务器。
有几个方法可以使你给团队每个成员提供访问权。 第一个就是给团队里的每个人创建账号,这种方法很直接但也很麻烦。 或许你不会想要为每个人运行一次 adduser
(或者 useradd
)并且设置临时密码。
第二个办法是在主机上建立一个 git
账户,让每个需要写权限的人发送一个 SSH 公钥, 然后将其加入 git
账户的 ~/.ssh/authorized_keys
文件。 这样一来,所有人都将通过 git
账户访问主机。 这一点也不会影响提交的数据——访问主机用的身份不会影响提交对象的提交者信息。
另一个办法是让 SSH
服务器通过某个 LDAP
服务,或者其他已经设定好的集中授权机制,来进行授权。 只要每个用户可以获得主机的 shell
访问权限,任何 SSH
授权机制你都可视为是有效的。
9.2 生成公钥
9.2.1 确认是否拥有秘钥
许多 Git
服务器都使用 SSH
公钥进行认证。 为了向 Git
服务器提供 SSH
公钥,如果某系统用户尚未拥有密钥,必须事先为其生成一份。 这个过程在所有操作系统上都是相似的。 首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH
密钥存储在其 ~/.ssh
目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥:
$ cd ~/.ssh
$ ls
authorized_keys2 id_dsa known_hosts
config id_dsa.pub
需要寻找一对以 id_dsa
或 id_rsa
命名的文件,其中一个带有 .pub
扩展名。 .pub
文件是你的公钥,另一个则是与之对应的私钥。 如果找不到这样的文件(或者根本没有 .ssh
目录),你可以通过运行 ssh-keygen
程序来创建它们。 在 Linux/macOS
系统中,ssh-keygen
随 SSH
软件包提供;在 Windows
上,该程序包含于 MSysGit
软件包中。
9.2.2 ssh-keygen
生成秘钥
$ ssh-keygen -o
Generating public/private rsa key pair.
Enter file in which to save the key (/home/schacon/.ssh/id_rsa):
Created directory '/home/schacon/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/schacon/.ssh/id_rsa.
Your public key has been saved in /home/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 schacon@mylaptop.local
首先 ssh-keygen
会确认密钥的存储位置(默认是 .ssh/id_rsa
),然后它会要求你输入两次密钥口令。 如果你不想在使用密钥时输入口令,将其留空即可。 然而,如果你使用了密码,那么请确保添加了 -o
选项,它会以比默认格式更能抗暴力破解的格式保存私钥。 你也可以用 ssh-agent
工具来避免每次都要输入密码。公钥看起来是这样的:
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@mylaptop.local
关于在多种操作系统中生成 SSH
密钥的更深入教程,请参阅 GitHub
的 SSH
密钥指南 。
9.2.3 添加公钥
现在,进行了上述操作的用户需要将各自的公钥发送给任意一个 Git
服务器管理员 (假设服务器正在使用基于公钥的 SSH
验证设置)。 他们所要做的就是复制各自的 .pub
文件内容,并配置服务器。
9.3 配置服务器
9.3.1 创建操作系统用户 git
我们来看看如何配置服务器端的 SSH
访问。 本例中,我们将使用 authorized_keys
方法来对用户进行认证。 同时我们假设你使用的操作系统是标准的 Linux
发行版,比如 Ubuntu
。 首先,创建一个操作系统用户 git
,并为其建立一个 .ssh
目录。
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
9.3.2 添加开发者公钥
我们需要为系统用户 git
的 authorized_keys
文件添加一些开发者 SSH
公钥。 假设我们已经获得了若干受信任的公钥,并将它们保存在临时文件中。 与前文类似,这些公钥看起来是这样的:
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
将这些公钥加入系统用户 git
的 .ssh
目录下 authorized_keys
文件的末尾:
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
9.3.3 为开发者新建一个空仓库
现在我们来为开发者新建一个空仓库。可以借助带 --bare
选项的 git init
命令来做到这一点,该命令在初始化仓库时不会创建工作目录:
$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/
接着,John
、Josie
或者 Jessica
中的任意一人可以将他们项目的最初版本推送到这个仓库中, 他只需将此仓库设置为项目的远程仓库并向其推送分支。 请注意,每添加一个新项目,都需要有人登录服务器取得 shell
,并创建一个裸仓库。 我们假定这个设置了 git
用户和 Git
仓库的服务器使用 gitserver
作为主机名。 同时,假设该服务器运行在内网,并且你已在 DNS
配置中将 gitserver
指向此服务器。 那么我们可以运行如下命令(假定 myproject
是已有项目且其中已包含文件):
# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master
此时,其他开发者可以克隆此仓库,并推回各自的改动,步骤很简单:
$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
通过这种方法,你可以快速搭建一个具有 读写 权限、面向多个开发者的 Git
服务器。
10 仓库的备份和恢复
平常会遇到一些情况,如更新系统或者置换电脑,需要把远程仓库的代码备份下来。在重新搭建好环境后重新恢复远程仓库。
10.1 备份
$ git clone --mirror ssh://root@192.168.1.61:9822/home/share/GitRepository/xxx.git
10.2 恢复
$ git push --mirror ssh://root@192.168.1.61:9822/home/share/GitRepository/xxx.git
# 如果远程已经没有这个仓库了,需要使用下面的命令重新创建
$ mkdir xxx.git && cd xxx.git
$ git init --bare
11 使用 GitLab
11.1 什么是 GitLab
GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务。
Gitlab 是一个提供代码托管、提交审核和问题跟踪的代码管理平台。对于软件工程质量管理非常重要。
目前已经在服务器上安装了 GitLab 进行源代码管理。网上有很多环境搭建教程,有需要可以学习一下。
11.2 远程仓库绑定
在网页端创建一个项目。不要勾选初始化仓库,创建的就是一个空仓库。进入项目后,部署好 ssh 密钥。
11.2.1 Git 全局设置
$ git config --global user.name "your name"
$ git config --global user.email "your email"
11.2.2 三种方式
-
创建一个新仓库
$ git clone git@192.168.1.61:xxx.git $ cd test $ touch README.md $ git add README.md $ git commit -m "add README" $ git push -u origin master
-
推送现有文件夹
$ cd existing_folder $ git init $ git remote add origin git@192.168.1.61:xxx.git $ git add . $ git commit -m "Initial commit" $ git push -u origin master
-
推送现有的 Git 仓库
$ cd existing_repo $ git remote rename origin old-origin $ git remote add origin git@192.168.1.61:xxx.git $ git push -u origin --all $ git push -u origin --tags