git 远程仓库代码迁移

1、代码迁移

1.1 多分支迁移

在开发中不可避免的会从一个仓库将代码迁移到另一个仓库,简单的做法是将代码全部档下来,然后删除远程分支,重新指向远程新仓库的地址,这样需要有一段时间的代码停用空挡,也就是说这段时间是不允许任何人提交代码的,而且缺少一个缓冲区,一旦迁移完成,如果有开发人员没有没有同步继续向旧仓库提交代码,那向旧仓库提交的代码就很难同步到新仓库。
我们是否有什么办法可以保证管理人员能够同时处理新旧仓库的版本,给开发人员一个切换远程仓库的缓冲时间那?

  • 1、首先修改旧远程仓库的别名
>git remote
origin
>git remote rename origin origin-old (将旧仓库origin修改为origin-old)
查看修改后的别名
>git remote
origin-old
查看本地分支和远程分支的跟踪关系,发现它们依然指向同一条日志
>git branch -vv
* main f2eda30 [origin-old/main] ...
除了别名之外指向关系没有发生任何变化
>git branch -r -a
* main
  remotes/origin-old/HEAD -> origin-old/main
  remotes/origin-old/main

此时我们仅仅只是对远程仓库修改了别名的名字,它的对应关系没有任何改变,目的只是为新仓库腾出一个位置,如果不介意,可以不必进行此操作,现在我们提交合并代码不会受到任何影响。

  • 2、接下来创建新仓库的引用(别名)
>git remote add origin ssh://git@*.git
查看创建效果,此时已经有两个别名,它们分别对应新旧仓库
git remote -v
origin  ssh://git@*.git (fetch)
origin  ssh://git@*.git (push)
origin-old      ssh://git@*.git (fetch)
origin-old      ssh://git@*.git (push)

每个分支,其实就只是一个轻量级指针而已,分支就指向了提交历史中的某个commit 对象。而commit 对象指的是这个项目的所有代码在完成一次提交后生成的快照版本,所以每一个commit 对象都代表了项目的一个版本。
正是因为指针的轻量,因此在git中分支的来回切换速度是非常快的。

  • 3、一些原理性知识(可以不关注)

    • (1)我们的项目是怎样知道当前工作在哪个分支上的?

    在执行完git init后本文件夹下会生成一个.git文件,打开.git文件会看到有一些文件和文件夹,其中有一个HEAD文件,其实可以将其理解为一个特殊的指针,这个指针指向了我们当前的工作分支,此时指向的正式main分支更确切的说是main指针,因为分支即指针。

    ref: refs/heads/main
    
    • (2)分支指向的内容

    顺着HEAD的内容往下查找打开 refs/heads/main 文件

     f2eda30a356db1683aee683c0eea1f248980fd39
    

    这个字符串又是什么意思那?比对一下提交日志,发现正好是一次commit 对象(也就是一个代码快照)不仅如此观察refs/remotes/origin-old/HEAD与refs/remotes/origin-old/main发现origin-old/HEAD->origin-old/main->此commit 对象
    那是不是说远程分支和本地分支永远都指向同一个commit 对象那?当然不是,当本地分支有提交或远程分支有更新时或者本地分支在版本间游走的时候,本地分支与远程分支都不可能指向同一个commit 对象。但最终的是会指向同一条记录的即本地分支与远程分支完全同步的时候

    git log
    commit f2eda30a356db1683aee683c0eea1f248980fd39 (HEAD -> main, origin-old/main, origin-old/HEAD)
    
    • (3)、git是怎样处理默认远程分支的?

    我们提交代码的时候往往不去指定远程分支是哪一个(当然你也可以去指定),而是直接通过git fetchgit push等命令直接拉取或推送到远程分支,因此可以想到git一定是有一个地方帮我们维护了这样一个关系,或者说维护着本地分支指向某个远程分支的指针,这个文件就是config

    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin-old"]
        url = ssh://git@*.git
        fetch = +refs/heads/*:refs/remotes/origin-old/*
    [branch "main"]
        remote = origin-old
        merge = refs/heads/main
    [remote "origin"]
        url = ssh://*.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    

    先不关心[core]中的内容。在本地分支[main]中我们看到有两条记录 remote 和 merge很显然,remote指向了远程仓库的别名也就是"origin-old"说明本地仓库与远程仓库的确建立了关联关系。可以通过git branch -avv命令查看本地分支、远程分支及他们的对应关系。
    我们查看一个本地多个分支指向同一个远程分支的例子,本地分支dev和main指向了同一个远程main分支

    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = ssh://git@gxx.sundun.cn:226/shce/code/shce-web.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "main"]
        remote = origin
        merge = refs/heads/main
    [branch "dev"]
        remote = origin
        merge = refs/heads/main
    

    只要改变了本地分支的merge,远程分支是通过[remote]中的fetch进行维持指向的,这里没有写死而是通过后缀匹配的方式来维护链接关系,这样的好处是无论远程仓库有多少个分支都可以通过一个配置来匹配,而具体的分支名则维护在[branch]中,这样一来本地有多少个分支就有多少个[branch]而一个远程仓库无论有多少个分支都只有一个与其对应的[remote],这样的好处是可以尽可能的保持远程仓库配置的稳定。

  • 4、本地分支指向新的远程仓库的main分支

通过git branch -u 远程仓库别名/分支名 命令可以帮助切换分支,那么是不是说直接执行命令就大功搞成了?答案是对的,但在一定条件下又不完全对,有时在执行之前还要执行一条其他命令。

>git branch -u origin/main
error: the requested upstream branch 'origin/main' does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.

直接执行报错,这是因为本地仓库只是建了远程新仓库的别名,但具体仓库中有它是不知道的因此首先执行同步。

同步前

>git branch -avv
* main                    f2eda30 [origin-old/main] ...
  remotes/origin-old/HEAD -> origin-old/main
  remotes/origin-old/main f2eda30 ...
>git fetch origin
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From ssh:*
 * [new branch]      main       -> origin/main

同步后

>git branch -avv
* main                    f2eda30 [origin-old/main] ...
  remotes/origin-old/HEAD -> origin-old/main
  remotes/origin-old/main f2eda30 ...
  remotes/origin/main     00c01ee Initial commit

同步后已经可以看到新仓库的分支

>git branch -u origin/main
Branch 'main' set up to track remote branch 'main' from 'origin'
>git branch -avv
* main                    f2eda30 [origin/main: ahead 80, behind 1] ...
  remotes/origin-old/HEAD -> origin-old/main
  remotes/origin-old/main f2eda30 ...
  remotes/origin/main     00c01ee Initial commit

此时分支切换成功。赶紧执行命令。

>git push
To ssh://gxx.sundun.cn:226/pm-hb/jn-shce/code/shce-master.git
 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'ssh://git@gxx.sundun.cn:226/pm-hb/jn-shce/code/shce-master.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
E:\Workspace\Idea_shce\shce-master>git push -f 
Enumerating objects: 2555, done.
Counting objects: 100% (2555/2555), done.
Delta compression using up to 8 threads
Compressing objects: 100% (1306/1306), done.
Writing objects: 100% (2555/2555), 1.48 MiB | 9.01 MiB/s, done.
Total 2555 (delta 1101), reused 1321 (delta 508)
remote: Resolving deltas: 100% (1101/1101), done.
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To ssh://gxx.sundun.cn:226/pm-hb/jn-shce/code/shce-master.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'ssh://git@gxx.sundun.cn:226/pm-hb/jn-shce/code/shce-master.git'

无论是同步还是温柔的推送还是强制推送不出意外都失败了。提示不能推送到一个受保护的分支。
既然保护了我们就给他解开保护 在gitlab 或 gitee 或 github上解开保护,别忘了操作完后开启保护。
"Settings" -> "Repository" -> Protected branches
此时执行强制提交已经可以提交成功。

>git push -f
Enumerating objects: 2555, done.
Counting objects: 100% (2555/2555), done.
Delta compression using up to 8 threads
Compressing objects: 100% (1306/1306), done.
Writing objects: 100% (2555/2555), 1.48 MiB | 7.72 MiB/s, done.
Total 2555 (delta 1101), reused 1321 (delta 508)
remote: Resolving deltas: 100% (1101/1101), done.
To ssh://gxx.sundun.cn:226/pm-hb/jn-shce/code/shce-master.git
 + 00c01ee...f2eda30 main -> main (forced update)

1.2 拉取或提交

先看一下结构好像并没有改变,其实背后的工作都已经完成,剩下的就是使用。

[remote "origin-old"]
	url = ssh://git@gxx.sundun.cn:226/shce/code/shce-master.git
	fetch = +refs/heads/*:refs/remotes/origin-old/*
[branch "main"]
	remote = origin-old
	merge = refs/heads/main
[remote "origin"]
	url = ssh://git@gxx.sundun.cn:226/pm-hb/jn-shce/code/shce-master.git
	fetch = +refs/heads/*:refs/remotes/origin/*

git branch -u origin-old/main切换到原仓库
git push提交代码
git fetch 同步远程分支到本地
git merge合并代码

git branch -u origin/main切换到新仓库
git push提交代码
git fetch 同步远程分支到本地
git merge合并代码

git remote rm 远程仓库别名 删除远程仓库别名

1.3 创建并切换本地及远程分支

git branch standard && git checkout standard && git push origin standard

2、总结

上面的叙述过去繁琐其实代码从一个仓库迁移到另一个仓库我们只需要按照下面这个步骤执行即可

  • git remote rename origin origin-old 修改别名
  • git remote add origin ssh://*.git 添加新的远程仓库
  • git fetch origin 同步远程仓库信息
  • git branch -u origin/main 切换到新的分支
  • git push origin HEAD:main -f 强制提交(如果报受保护的分支先去掉保护允许强制提交)
  • git branch standard && git checkout standard && git push origin standard 在当前版本的基础上创建新的分支并推送到远程仓库
  • 一下命令为具体业务,请根据自己情况自行百度。
  • git branch -m main main-old 修改本地分支名
  • git checkout main-old 切换到重命名的分支
  • git branch -u origin-old/dev dev 将本地分支dev与远程分支关联

最后的关系图

  dev                        ff154c1 [origin-old/dev: behind 1] 
  main                      ff154c1 [origin/main] 
* main-old                f64a17b [origin-old/main: behind 132] 
  standard                 ff154c1 [origin/standard] 
  remotes/origin-old/HEAD -> origin-old/main
  remotes/origin-old/dev  e3fab1c 
  remotes/origin-old/main ff154c1 
  remotes/origin/main     ff154c1 
  remotes/origin/standard ff154c1 

将来代码全部在新仓库上开发时可以删掉旧的分支。

注意这是最后的关系,在程序迁移期间一定不是这样的,需要站在最新版本的分支上去切换指向远程仓库的指针来拉取推送代码,因为要保持HEAD指针指向的工作区的代码一定是最新的。切不可通过checkout的方式去切换分支。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 起步 1 1.1 关于版本控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 本地版本控制系统 . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 集中化的版本控制系统 . . . . . . . . . . . . . . . . . . . . 1 1.1.3 分布式版本控制系统 . . . . . . . . . . . . . . . . . . . . . 2 1.2 Git 的历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Git 基础要点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3.1 直接快照,而非比较差异 . . . . . . . . . . . . . . . . . . . 4 1.3.2 近乎所有操作都可本地执行 . . . . . . . . . . . . . . . . . . 5 1.3.3 时刻保持数据完整性 . . . . . . . . . . . . . . . . . . . . . 5 1.3.4 多数操作仅添加数据 . . . . . . . . . . . . . . . . . . . . . 5 1.3.5 三种状态 . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.4 安装 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.4.1 从源代码安装 . . . . . . . . . . . . . . . . . . . . . . . . 7 1.4.2 在 Linux 上安装 . . . . . . . . . . . . . . . . . . . . . . . 7 1.4.3 在 Mac 上安装 . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4.4 在 Windows 上安装 . . . . . . . . . . . . . . . . . . . . . . 8 1.5 初次运行 Git 前的配置 . . . . . . . . . . . . . . . . . . . . . . . 9 1.5.1 用户信息 . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5.2 文本编辑器 . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5.3 差异分析工具 . . . . . . . . . . . . . . . . . . . . . . . . 10 1.5.4 查看配置信息 . . . . . . . . . . . . . . . . . . . . . . . . 10 1.6 获取帮助 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.7 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2 Git 基础 13 2.1 取得项目的 Git 仓库 . . . . . . . . . . . . . . . . . . . . . . . . 13 2.1.1 从当前目录初始化 . . . . . . . . . . . . . . . . . . . . . . 13 2.1.2 从现有仓库克隆 . . . . . . . . . . . . . . . . . . . . . . . 14 2.2 记录每次更新到仓库 . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.1 检查当前文件状态 . . . . . . . . . . . . . . . . . . . . . . 14 2.2.2 跟踪新文件 . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2.3 暂存已修改文件 . . . . . . . . . . . . . . . . . . . . . . . 16 2.2.4 忽略某些文件 . . . . . . . . . . . . . . . . . . . . . . . . 17 2.2.5 查看已暂存和未暂存的更新 . . . . . . . . . . . . . . . . . . 18 2.2.6 提交更新 . . . . . . . . . . . . . . . . . . . . . . . . . . 20 iii 2.2.7 跳过使用暂存区域 . . . . . . . . . . . . . . . . . . . . . . 21 2.2.8 移除文件 . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.9 移动文件 . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.3 查看提交历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.3.1 限制输出长度 . . . . . . . . . . . . . . . . . . . . . . . . 28 2.3.2 使用图形化工具查阅提交历史 . . . . . . . . . . . . . . . . . 29 2.4 撤消操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.4.1 修改最后一次提交 . . . . . . . . . . . . . . . . . . . . . . 29 2.4.2 取消已经暂存的文件 . . . . . . . . . . . . . . . . . . . . . 30 2.4.3 取消对文件的修改 . . . . . . . . . . . . . . . . . . . . . . 31 2.5 远程仓库的使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.5.1 查看当前的远程库 . . . . . . . . . . . . . . . . . . . . . . 32 2.5.2 添加远程仓库 . . . . . . . . . . . . . . . . . . . . . . . . 32 2.5.3 从远程仓库抓取数据 . . . . . . . . . . . . . . . . . . . . . 33 2.5.4 推送数据到远程仓库 . . . . . . . . . . . . . . . . . . . . . 33 2.5.5 查看远程仓库信息 . . . . . . . . . . . . . . . . . . . . . . 34 2.5.6 远程仓库的删除和重命名 . . . . . . . . . . . . . . . . . . . 35 2.6 打标签 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.6.1 列显已有的标签 . . . . . . . . . . . . . . . . . . . . . . . 35 2.6.2 新建标签 . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.6.3 含附注的标签 . . . . . . . . . . . . . . . . . . . . . . . . 36 2.6.4 签署标签 . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.6.5 轻量级标签 . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.6.6 验证标签 . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.6.7 后期加注标签 . . . . . . . . . . . . . . . . . . . . . . . . 38 2.6.8 分享标签 . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.7 技巧和窍门 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.7.1 自动完成 . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.7.2 Git 命令别名 . . . . . . . . . . . . . . . . . . . . . . . . 41 2.8 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3 Git 分支 43 3.1 何谓分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.2 基本的分支与合并 . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.2.1 基本分支 . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.2.2 基本合并 . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.2.3 冲突的合并 . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3 分支管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.4 分支式工作流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 3.4.1 长期分支 . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.4.2 特性分支 . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.5 远程分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.5.1 推送 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.5.2 跟踪分支 . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.5.3 删除远程分支 . . . . . . . . . . . . . . . . . . . . . . . . 62 3.6 衍合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 iv 3.6.1 衍合基础 . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.6.2 更多有趣的衍合 . . . . . . . . . . . . . . . . . . . . . . . 64 3.6.3 衍合的风险 . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.7 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4 服务器上的 Git 69 4.1 协议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.1.1 本地协议 . . . . . . . . . . . . . . . . . . . . . . . . . . 69 优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 缺点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.1.2 SSH 协议 . . . . . . . . . . . . . . . . . . . . . . . . . . 70 优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 缺点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.1.3 Git 协议 . . . . . . . . . . . . . . . . . . . . . . . . . . 71 优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 缺点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.1.4 HTTP/S 协议 . . . . . . . . . . . . . . . . . . . . . . . . . 72 优点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 缺点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.2 在服务器部署 Git . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.2.1 将纯目录转移到服务器 . . . . . . . . . . . . . . . . . . . . 73 4.2.2 小型安装 . . . . . . . . . . . . . . . . . . . . . . . . . . 74 SSH 连接 . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.3 生成 SSH 公钥 . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.4 架设服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4.5 公共访问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.6 网页界面 GitWeb . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.7 权限管理器 Gitosis . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.8 Git 进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.9 Git 托管服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.9.1 GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.9.2 建立账户 . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.9.3 建立新仓库 . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.9.4 从 Subversion 中导入项目 . . . . . . . . . . . . . . . . . . 89 4.9.5 开始合作 . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.9.6 项目页面 . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4.9.7 派生(forking)项目 . . . . . . . . . . . . . . . . . . . . . 92 4.9.8 GitHub 小节 . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.10 小节 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5 分布式 Git 95 5.1 分布式工作流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 5.1.1 集中式工作流 . . . . . . . . . . . . . . . . . . . . . . . . 95 5.1.2 集成管理员工作流 . . . . . . . . . . . . . . . . . . . . . . 96 5.1.3 司令官与副官工作流 . . . . . . . . . . . . . . . . . . . . . 97 5.2 为项目作贡献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 v 5.2.1 提交指南 . . . . . . . . . . . . . . . . . . . . . . . . . . 98 5.2.2 私有的小型团队 . . . . . . . . . . . . . . . . . . . . . . . 99 5.2.3 私有团队间协作 . . . . . . . . . . . . . . . . . . . . . . . 104 5.2.4 公开的小型项目 . . . . . . . . . . . . . . . . . . . . . . . 108 5.2.5 公开的大型项目 . . . . . . . . . . . . . . . . . . . . . . . 112 5.2.6 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 5.3 项目的管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 5.3.1 使用特性分支进行工作 . . . . . . . . . . . . . . . . . . . . 115 5.3.2 采纳来自邮件的补丁 . . . . . . . . . . . . . . . . . . . . . 115 使用 apply 命令应用补丁 . . . . . . . . . . . . . . . . . . . 115 使用 am 命令应用补丁 . . . . . . . . . . . . . . . . . . . . 116 5.3.3 检出远程分支 . . . . . . . . . . . . . . . . . . . . . . . . 118 5.3.4 决断代码取舍 . . . . . . . . . . . . . . . . . . . . . . . . 118 5.3.5 代码集成 . . . . . . . . . . . . . . . . . . . . . . . . . . 119 合并流程 . . . . . . . . . . . . . . . . . . . . . . . . . . 120 大项目的合并流程 . . . . . . . . . . . . . . . . . . . . . . 122 衍合与挑拣(cherry-pick)的流程 . . . . . . . . . . . . . . . 122 5.3.6 给发行版签名 . . . . . . . . . . . . . . . . . . . . . . . . 123 5.3.7 生成内部版本号 . . . . . . . . . . . . . . . . . . . . . . . 124 5.3.8 准备发布 . . . . . . . . . . . . . . . . . . . . . . . . . . 125 5.3.9 制作简报 . . . . . . . . . . . . . . . . . . . . . . . . . . 125 5.4 小结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 6 Git 工具 127 6.1 修订版本(Revision)选择 . . . . . . . . . . . . . . . . . . . . . . 127 6.1.1 单个修订版本 . . . . . . . . . . . . . . . . . . . . . . . . 127 6.1.2 简短的SHA . . . . . . . . . . . . . . . . . . . . . . . . . . 127 6.1.3 关于 SHA-1 的简短说明 . . . . . . . . . . . . . . . . . . . . 128 6.1.4 分支引用 . . . . . . . . . . . . . . . . . . . . . . . . . . 129 6.1.5 引用日志里的简称 . . . . . . . . . . . . . . . . . . . . . . 129 6.1.6 祖先引用 . . . . . . . . . . . . . . . . . . . . . . . . . . 130 6.1.7 提交范围 . . . . . . . . . . . . . . . . . . . . . . . . . . 132 双点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 多点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 三点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 6.2 交互式暂存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 6.2.1 暂存和撤回文件 . . . . . . . . . . . . . . . . . . . . . . . 134 6.2.2 暂存补丁 . . . . . . . . . . . . . . . . . . . . . . . . . . 136 6.3 储藏(Stashing) . . . . . . . . . . . . . . . . . . . . . . . . . . 137 6.3.1 储藏你的工作 . . . . . . . . . . . . . . . . . . . . . . . . 138 6.3.2 从储藏中创建分支 . . . . . . . . . . . . . . . . . . . . . . 139 6.4 重写历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6.4.1 改变最近一次提交 . . . . . . . . . . . . . . . . . . . . . . 140 6.4.2 修改多个提交说明 . . . . . . . . . . . . . . . . . . . . . . 141 6.4.3 重排提交 . . . . . . . . . . . . . . . . . . . . . . . . . . 142 6.4.4 压制(Squashing)提交 . . . . . . . . . . . . . . . . . . . . . 143 vi 6.4.5 拆分提交 . . . . . . . . . . . . . . . . . . . . . . . . . . 144 6.4.6 核弹级选项: filter-branch . . . . . . . . . . . . . . . . . . 144 从所有提交中删除一个文件 . . . . . . . . . . . . . . . . . . 144 将一个子目录设置为新的根目录 . . . . . . . . . . . . . . . . 145 全局性地更换电子邮件地址 . . . . . . . . . . . . . . . . . . 145 6.5 使用 Git 调试 . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 6.5.1 文件标注 . . . . . . . . . . . . . . . . . . . . . . . . . . 146 6.5.2 二分查找 . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.6 子模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 6.6.1 子模块初步 . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.6.2 克隆一个带子模块的项目 . . . . . . . . . . . . . . . . . . . 151 6.6.3 上层项目 . . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.6.4 子模块的问题 . . . . . . . . . . . . . . . . . . . . . . . . 153 6.7 子树合并 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 6.8 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 7 自定义 Git 157 7.1 配置 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 7.1.1 客户端基本配置 . . . . . . . . . . . . . . . . . . . . . . . 157 core.editor . . . . . . . . . . . . . . . . . . . . . . . . . 158 commit.template . . . . . . . . . . . . . . . . . . . . . . . 158 core.pager . . . . . . . . . . . . . . . . . . . . . . . . . 159 user.signingkey . . . . . . . . . . . . . . . . . . . . . . . 159 core.excludesfile . . . . . . . . . . . . . . . . . . . . . . 159 help.autocorrect . . . . . . . . . . . . . . . . . . . . . . 159 7.1.2 Git中的着色 . . . . . . . . . . . . . . . . . . . . . . . . . 160 color.ui . . . . . . . . . . . . . . . . . . . . . . . . . . 160 color.* . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 7.1.3 外部的合并与比较工具 . . . . . . . . . . . . . . . . . . . . 160 7.1.4 格式化与空白 . . . . . . . . . . . . . . . . . . . . . . . . 163 core.autocrlf . . . . . . . . . . . . . . . . . . . . . . . . 163 core.whitespace . . . . . . . . . . . . . . . . . . . . . . . 164 7.1.5 服务器端配置 . . . . . . . . . . . . . . . . . . . . . . . . 164 receive.fsckObjects . . . . . . . . . . . . . . . . . . . . . 164 receive.denyNonFastForwards . . . . . . . . . . . . . . . . . 165 receive.denyDeletes . . . . . . . . . . . . . . . . . . . . . 165 7.2 Git属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7.2.1 二进制文件 . . . . . . . . . . . . . . . . . . . . . . . . . 165 识别二进制文件 . . . . . . . . . . . . . . . . . . . . . . . 165 比较二进制文件 . . . . . . . . . . . . . . . . . . . . . . . 166 7.2.2 关键字扩展 . . . . . . . . . . . . . . . . . . . . . . . . . 168 7.2.3 导出仓库 . . . . . . . . . . . . . . . . . . . . . . . . . . 170 export-ignore . . . . . . . . . . . . . . . . . . . . . . . . 170 export-subst . . . . . . . . . . . . . . . . . . . . . . . . 170 7.2.4 合并策略 . . . . . . . . . . . . . . . . . . . . . . . . . . 171 7.3 Git挂钩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 vii 7.3.1 安装一个挂钩 . . . . . . . . . . . . . . . . . . . . . . . . 171 7.3.2 客户端挂钩 . . . . . . . . . . . . . . . . . . . . . . . . . 171 提交工作流挂钩 . . . . . . . . . . . . . . . . . . . . . . . 171 E-mail工作流挂钩 . . . . . . . . . . . . . . . . . . . . . . 172 其他客户端挂钩 . . . . . . . . . . . . . . . . . . . . . . . 172 7.3.3 服务器端挂钩 . . . . . . . . . . . . . . . . . . . . . . . . 173 pre-receive 和 post-receive . . . . . . . . . . . . . . . . . 173 update . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 7.4 Git 强制策略实例 . . . . . . . . . . . . . . . . . . . . . . . . . . 173 7.4.1 服务端挂钩 . . . . . . . . . . . . . . . . . . . . . . . . . 173 指定特殊的提交信息格式 . . . . . . . . . . . . . . . . . . . 174 实现基于用户的访问权限控制列表(ACL)系统 . . . . . . . . . . 175 只允许 Fast-Forward 类型的推送 . . . . . . . . . . . . . . . 177 7.4.2 Client-Side Hooks . . . . . . . . . . . . . . . . . . . . . . 179 7.5 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 8 Git 与其他系统 183 8.1 Git 与 Subversion . . . . . . . . . . . . . . . . . . . . . . . . . 183 8.1.1 git svn . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 8.1.2 初始设定 . . . . . . . . . . . . . . . . . . . . . . . . . . 184 8.1.3 入门 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 8.1.4 提交到 Subversion . . . . . . . . . . . . . . . . . . . . . . 186 8.1.5 拉取最新进展 . . . . . . . . . . . . . . . . . . . . . . . . 187 8.1.6 Git 分支问题 . . . . . . . . . . . . . . . . . . . . . . . . 188 8.1.7 Subversion 分支 . . . . . . . . . . . . . . . . . . . . . . . 189 创建新的 SVN 分支 . . . . . . . . . . . . . . . . . . . . . . 189 8.1.8 切换当前分支 . . . . . . . . . . . . . . . . . . . . . . . . 190 8.1.9 对应 Subversion 的命令 . . . . . . . . . . . . . . . . . . . 190 SVN 风格的历史 . . . . . . . . . . . . . . . . . . . . . . . 190 SVN 日志 . . . . . . . . . . . . . . . . . . . . . . . . . . 191 SVN 服务器信息 . . . . . . . . . . . . . . . . . . . . . . . 191 略 Subversion 之所略 . . . . . . . . . . . . . . . . . . . . 192 8.1.10Git-Svn 总结 . . . . . . . . . . . . . . . . . . . . . . . . 192 8.2 迁移Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 8.2.1 导入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 8.2.2 Subversion . . . . . . . . . . . . . . . . . . . . . . . . . 193 8.2.3 Perforce . . . . . . . . . . . . . . . . . . . . . . . . . . 194 8.2.4 自定导入脚本 . . . . . . . . . . . . . . . . . . . . . . . . 196 8.3 总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 9 Git 内部原理 203 9.1 底层命令 (Plumbing) 和高层命令 (Porcelain) . . . . . . . . . . . . . 203 9.2 Git 对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 9.2.1 tree (树) 对象 . . . . . . . . . . . . . . . . . . . . . . . 206 9.2.2 commit (提交) 对象 . . . . . . . . . . . . . . . . . . . . . 208 9.2.3 对象存储 . . . . . . . . . . . . . . . . . . . . . . . . . . 210 viii 9.3 Git References . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 9.3.1 HEAD 标记 . . . . . . . . . . . . . . . . . . . . . . . . . . 213 9.3.2 Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 9.3.3 Remotes . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 9.4 Packfiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 9.5 The Refspec . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 9.5.1 推送 Refspec . . . . . . . . . . . . . . . . . . . . . . . . 220 9.5.2 删除引用 . . . . . . . . . . . . . . . . . . . . . . . . . . 221 9.6 传输协议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 9.6.1 哑协议 . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 9.6.2 智能协议 . . . . . . . . . . . . . . . . . . . . . . . . . . 223 上传数据 . . . . . . . . . . . . . . . . . . . . . . . . . . 223 下载数据 . . . . . . . . . . . . . . . . . . . . . . . . . . 224 9.7 维护及数据恢复 . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 9.7.1 维护 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 9.7.2 数据恢复 . . . . . . . . . . . . . . . . . . . . . . . . . . 226 9.7.3 移除对象 . . . . . . . . . . . . . . . . . . . . . . . . . . 228 9.8 总结 . . . . .
在*第一章*,我们将介绍版本控制系统(VCSs)和 Git 的基本概念——不涉及技术内容,仅仅是什么是 Git, 为 什么它会成为 VCSs 大家庭中的一员,它与其它 VCSs 的区别,以及为什么那么多人都在使用 Git。然后,我们将 介绍如何下载 Git 以及如果你的系统没有安装 Git,如何为第一次运行做准备。 在*第二章*,我们将阐述 Git 的基本使用——包含你在使用 Git 时可能遇到的 80% 的情形。通过阅读本章,你应 该 能够克隆仓库、查看项目历史、修改文件和贡献更改。如果本书在此刻自燃,你应该已经能够使用已经学到 的漂亮 有用的 Git 知识获取到另外一份拷贝。 *第三章*关注于 Git 的分支模型。分支模型通常被认为是 Git 的杀手级特性。这里,你将学习到究竟是什么让 Git 与众不同。学习完本章,你可能需要一段时间来思考,在 Git 分支成为你的生活的一部分之前,你到底是如何生 活的。 *第四章*关注于服务器端的 Git。本章面向那些希望在你自己的组织或个人服务器搭建用于合作的 Git 的读者。 如果你希望让别人处理这些事务,我们也会探讨一些托管选项。 *第五章*将阐述多种分布式工作流的细节,以及如何使用 Git 实现它们。学习完本章,你应该能够在多个远程仓 库 之间游刃有余,通过电子邮件使用 Git,熟练地处理多个远程分支和合作者贡献的补丁。 *第六章*介绍 GitHub 托管服务以及深层次的工具。我们将涵盖注册与账户管理,创建和使用 Git 仓库,贡献项 目的 普通工作流以及接受他人的贡献,GitHub 的可编程接口和那些能够让你的生活变得更简单的小技巧。 *第七章*关于 Git 的高级命令。你将学习到一些高级主题,诸如掌握可怕的“reset”命令,使用二分搜索识别错 误,编辑 历史,细节版本选择等等。本章的介绍将丰富你的 Git 知识,让你成为一个真正的大师。 *第八章*关于 Git 环境的自定义配置,包括设置用于增强或促进自定义策略的钩子脚本以及按照你所需要的方式 进行 工作的环境配置。我们还会介绍构建你自己的脚本集,以增强自定义提交策略。 *第九章*对比 Git 和其它 VCSs,包括在 Subversion(SVN)的世界使用 Git 以及从其它 VCSs 迁移Git。很多 组织 仍在使用 SVN,并且也没有计划改变,此时,你将了解到 Git 不可思议的能力——本章将展示,在你不得不 使用 SVN 服务器 的时候如何协同合作。我们还将介绍如何从不同系统导入项目,以便你能够全身心投入 Git 的 怀抱。 *第十章*深入 Git 阴暗而漂亮的实现细节。现在,你已经知道所有有关 Git 的知识,能够熟练运用 Git 的强大优 雅的功能。 接下来,你可以继续学习 Git 如何存储对象、Git 的对象模型是怎样的、打包文件的细节、服务器协 议等更多知识。 本书自始至终都将引用本章的内容,以便你能够在当时就可以深入了解。但是,如果你像我们 一样希望深入学习技术细节, 你可能想先阅读第十章。我们将选择权交给你。
回答: 当出现"no such origin"的错误提示时,通常是因为本地仓库没有正确关联到远程仓库。解决这个问题的方法是重新关联远程仓库。根据引用\[1\]中的提示,可以使用以下命令来删除关联的远程库并重新关联自己的仓库: ``` git remote rm origin #删除关联的origin远程git remote add origin xxxxx #重新关联自己的仓库 ``` 另外,根据引用\[2\]中的提示,还可以使用以下步骤来迁移代码到新的仓库并关联远程仓库: ``` git remote rename origin origin-old #修改别名 git remote add origin ssh://*.git #添加新的远程仓库 git fetch origin #同步远程仓库信息 git branch -u origin/main #切换到新的分支 git push origin HEAD:main -f #强制提交 git branch standard && git checkout standard && git push origin standard #在当前版本的基础上创建新的分支并推送到远程仓库 ``` 最后,根据引用\[3\]中的提示,可以使用以下命令来查看本地分支、远程分支及它们的对应关系: ``` git branch -avv #查看本地分支、远程分支及他们的对应关系 ``` 希望以上信息能够帮助你解决问题。 #### 引用[.reference_title] - *1* [Git绑定远程仓库报错error: remote origin already exists.](https://blog.csdn.net/qq_52855464/article/details/126475334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [git 远程仓库代码迁移](https://blog.csdn.net/qq_16494381/article/details/123715982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值