Git 远程库——代码托管中心

创建本地库

D:\GitWorkSpace目录下创建新的文件夹MyFirstProject_GitHub,并为其执行 Git 初始化。

  1. 33891@LeapingQuantum MINGW64 ~
  2. $ cd /d/GitWorkSpace/
  3. 33891@LeapingQuantum MINGW64 /d/GitWorkSpace
  4. $ mkdir MyFirstProject_GitHub
  5. 33891@LeapingQuantum MINGW64 /d/GitWorkSpace
  6. $ ls -d */
  7. MyFirstProject// MyFirstProject_GitHub//
  8. 33891@LeapingQuantum MINGW64 /d/GitWorkSpace
  9. $ cd ./MyFirstProject_GitHub/
  10. 33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub
  11. $ git init
  12. Initialized empty Git repository in D:/GitWorkSpace/MyFirstProject_GitHub/.git/

在项目中新建一个文件test.txt并写入内容。

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ vim test.txt

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ cat test.txt
这是新建前的第一次编辑。

将新文件添加到暂存区、提交到本地库。

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git commit -m "第一次提交" test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory
[master (root-commit) 5aa6f3a] 第一次提交
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git status
On branch master
nothing to commit, working tree clean

创建远程库

在 GitHub 上完成账号的注册。

创建一个新的仓库

image.png

填写表单

image.png

完成创建

image.png

在本地的远程库地址别名

在本地连接远程库时,远程库的地址是必需的。但这往往长而复杂,因此可以在本地设置远程库的地址别名。

当前的远程库地址:https://github.com/TullyMonster/MyFirstProject_GitHub.git

查看别名

使用git remote -v命令查看已保存在本地库的地址别名:

不同本地库的远程库别名相互独立,互不影响。

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git remote -v

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$

本地未保存任何远程地址的别名。

设置别名

使用git remote add <Alias4RemoteRepositoryAddress> <RemoteRepositoryAddress>命令为远程地址<RemoteRepositoryAddress>设置别名<Alias4RemoteRepositoryAddress>

一般以origin为远程库别名。

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git remote add origin https://github.com/TullyMonster/MyFirstProject_GitHub.git

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git remote -v
origin  https://github.com/TullyMonster/MyFirstProject_GitHub.git (fetch)
origin  https://github.com/TullyMonster/MyFirstProject_GitHub.git (push)

命令git remote add origin https://github.com/TullyMonster/MyFirstProject_GitHub.git的含义是: 为远程地址https://github.com/TullyMonster/MyFirstProject_GitHub.git在本地库设置名为origin的别名。即,用origin代替上述地址。 再次查看别名配置时,括号中的fetchpush分别表示用对应别名拉起或推送数据时使用的链接。

本地库的推送

使用命令git push <Alias4RemoteRepositoryAddress> <LocalRepositoryBranchName>将本地库分支<LocalRepositoryBranchName>推送到远程库<Alias4RemoteRepositoryAddress>

33891@LeapingQuantum MINGW64 /d/GitWorkSpace/MyFirstProject_GitHub (master)
$ git push origin master
info: please complete authentication in your browser...
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 282 bytes | 282.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/TullyMonster/MyFirstProject_GitHub.git
 * [new branch]      master -> master

推送成功:这个过程将显式或隐式地完成账号验证。

image.png

远程库的克隆

在其他本地路径或计算机上克隆远程库。

配置待克隆的本地目标路径

计划将https://github.com/TullyMonster/MyFirstProject_GitHub的项目克隆到D:\GitWorkSpace_CLONE路径下的MyFirstProject_GitHub文件夹中。

执行克隆

在目标文件夹MyFirstProject_GitHub_CLONE下执行git clone <RemoteRepositoryAddress>命令,将远程地址<RemoteRepositoryAddress>的项目克隆到本地(MyFirstProject_GitHub_CLONE)。
image.png

33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE
$ git clone https://github.com/TullyMonster/MyFirstProject_GitHub.git
Cloning into 'MyFirstProject_GitHub'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

克隆到本地库后的文件树结构:

D:\GitWorkSpace_CLONE
│  
└─MyFirstProject_GitHub
        test.txt

克隆的效果

  1. 完整地下载远程库项目到本地;
  2. 初始化本地库;
  3. 创建远程地址别名(默认为origin)。

    修改来自克隆的本地库并提交版本

    修改

    ``` 33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE/MyFirstProject_GitHub (master) $ cat test.txt 这是新建前的第一次编辑。

33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE/MyFirstProject_GitHub (master) $ vim test.txt

33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE/MyFirstProject_GitHub (master) $ cat test.txt 这是新建前的第一次编辑。 这是克隆后的修改。

<a name="C9Za8"></a>
### 提交

33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE/MyFirstProject_GitHub (master) $ git add test.txt

33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE/MyFirstProject_GitHub (master) $ git commit -m “来自克隆的提交” test.txt [master 7038017] 来自克隆的提交 1 file changed, 1 insertion(+)

33891@LeapingQuantum MINGW64 /d/GitWorkSpace_CLONE/MyFirstProject_GitHub (master) $ git log —pretty=oneline 703801763c2f22e68f482eb84d233db74cc3cbd1 (HEAD -> master) 来自克隆的提交 5aa6f3a1d186fb19f73380b426249a986d292c08 (origin/master, origin/HEAD) 第一次提交 ```

邀请开发者加入团队

在加入团队之前,开发者无法将本地库使用git push origin master命令推送版本到远程库。

若要邀请开发者加入团队,远程仓库所有者需要前往项目的设置 (Settings) 的访问管理 (Manage access) 中添加成员 (Add people)。
image.png
image.png image.png

远程开发者提交修改

团队成员[LS201213](https://github.com/LS201213)加入协作后,将远程库克隆到本地,并对test.txt文件的最后一行新增了一行内容:这是克隆后的修改。
随后,push到远程库:
image.png

拉取已更新的远程库

拉取 (pull) 远程库操作实质是抓取 (fetch) 和合并 (merge) 操作的集合。将这两个操作分开进行,可以防止因过程复杂而引发的错误。

git fetch <Alias4RemoteRepositoryAddress> <RemoteBranch>

fetch命令和pull命令对于远程库来说都是读取操作,不需要公有库的身份验证。

将远程库的项目下载到本地,但不会对工作区做修改。可使用git checkout <Alias4RemoteRepositoryAddress>/<RemoteBranchAddress>命令将分支切换到fetch的内容,查看远程库的状态(示例:git checkout origin/master)。

git merge <Alias4RemoteRepositoryAddress>/<RemoteBranch>

实现将本地库的版本与远程已保存在本地的版本合并。

git pull <Alias4RemoteRepositoryAddress> <RemoteBranch>

依次完成抓取 (fetch) 和合并 (merge) 操作。

协同开发时的冲突处理

如果不是基于 GitHub 远程库最新版所做的修改,则不能直接推送——必须先拉取。 若随后引发了冲突,则按照“本地分支冲突”解决即可。

协同开发时,开发团队若对同一位置的代码执行了不同的修改,除第一个提交到本地库的开发者外,其他开发者再次提交时将会产生冲突。
即,若使用git push <Alias4RemoteRepositoryAddress> <RemoteBranch>命令将产生错误,推送失败。
因此,需要先将远程库的更新拉渠道本地:git pull <Alias4RemoteRepositoryAddress> <RemoteBranch>,但必定会产生冲突。于是进入合并冲突状态(<LocalBranch>|MERGING)。随后,根据提示采用与本地库类似的方法解决冲突:
本地库操作
冲突解决完毕后,使用git pull <Alias4RemoteRepositoryAddress> <RemoteBranch>命令将本地库推送到远程库。