Git使用笔记

官网的使用说明

1 创建本地仓库,并链接远程仓库

1.1 安装 GIT for Windows

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 都会用用户名和邮箱纪录
  • githubcontributions 跟你的邮箱是有关联的
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状态

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.0v2.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_dsaid_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是你的公钥,另一个则是与之对应的私钥。 如果找不到这样的文件(或者根本没有 .ssh 目录),你可以通过运行 ssh-keygen 程序来创建它们。 在 Linux/macOS 系统中,ssh-keygenSSH 软件包提供;在 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 密钥的更深入教程,请参阅 GitHubSSH 密钥指南

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 添加开发者公钥

​ 我们需要为系统用户 gitauthorized_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/

​ 接着,JohnJosie 或者 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
    
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值