码云管理项目版本控制的终端命令(git)

码云管理项目版本控制的终端命令(git),第1张

所有 *** 作要在git工程下进行 cd 你的项目拖进去(终端进行)

1回退到当前版本(放弃所有修改)(这里只回退到最后一次提交的版本)

git status 回车 (查看状态) 

git reset --hard 回车 (放弃当前所有修改及所有待commit)

2针对单个文件的修改回退

git checkout haham 回车

3回到某个版本,并保存该版本以后的修改。(此步骤慎重 *** 作)

git log 回车 (查看提交日志 会退到指定版本) 以下是打印信息

commit cac5f6efe29163081694b6c2f6cf9303436a18f6

Author: AppleDate:  Mon May 8 08:28:31 2017 +0800

2017 5 8

git reset cac5f6efe29163081694b6c2f6cf9303436a18f6 回车

4直接回到某个版本,放弃该版本以后的修改。

git log 回车

commit cac5f6efe29163081694b6c2f6cf9303436a18f6

Author: AppleDate:  Mon May 8 08:28:31 2017 +0800

2017 5 8

git reset --hard cac5f6efe29163081694b6c2f6cf9303436a18f6 回车

以上是 *** 作本地git版本,以下 *** 作远程仓库的版本(祸从手出, *** 作需谨慎)

1回退远程仓库的版本

先在本地切换到远程仓库要回退的分支对应的本地分支,然后本地回退至你需要的版本,然后执行:

git push <仓库名> <分支名> -f

2以当前版本为基础,回退指定个commit

首先,确认你当前的版本需要回退多少个版本,然后计算出你要回退的版本数量,执行如下命令

git reset HEAD~X //X代表你要回退的版本数量,是数字!!!!

需要注意的是,如果你是合并过分支,那么背合并分支带过来的commit并不会被计入回退数量中,而是只计算一个,所以如果需要一次回退多个commit,不建议使用这种方法

3回退到和远程版本一样

有时候,当发生错误修改需要放弃全部修改时,可以以远程分支作为回退点退回到与远程分支一样的地方,执行的命令如下

git reset --hard origin/master // origin代表你远程仓库的名字,master代表分支名

正所谓天下大事合久必分,分久必合。实际工作中的项目也类似,有的项目越来越大,或者有时候需要把没有前后端分离的项目代码拆分到两个仓库里,就涉及到对已有git项目的迁移 *** 作。

如果只是简单地把代码拆开并不难,可以选择直接下载git项目源代码压缩包,拆分后push到新建的git仓库里就可以了。

但是现实世界往往没有那么简单,比如正在进行的开发分支还没有合并,或者我们想保留提交记录和分支关系。如此种种原因导致无法简单粗暴地把源代码扔到一个新建的git仓库里,还涉及对git记录进行必要的裁剪。

本文就介绍一个好用的工具来进行无损的git仓库迁移。

在实际工作中,我们有一个项目,其项目目录结构很简单,是一个既含有前端代码,也含有服务端代码的仓库,如下所示:

我们希望将前端和服务端代码拆分成两个独立的git仓库,但是因为开发同学还有正在开发的功能分支没有合并,因此我们希望能够同时迁移代码和git提交 历史 以及分支。最终希望得到的结果是:

git repo A: /server/

git repo B: /webapp/

通过查看git文档,首先考虑使用git filter-branch命令来进行迁移。简单来说该命令可以用来 *** 作目录树,同时修改 历史 提交记录。

在我还没来得及完全理解这个命令之前,就看到文档中有这样一段warning

这里提到了filter-branch命令由于有可能产生杂乱的提交 历史 ,以及惨不忍睹的执行效率,所以最终推荐了一个第三方工具git filter-repo。接下来,就该今天的主角登场了。

在github首页上,关于git-filter-repo有这样的描述

接下来我们考虑如何利用这个强大的工具来进行git项目的迁移。

首先,需要定义成功迁移的标准:

查看git-filter-repo的文档可以看到有不少简单的示例,很幸运有一些例子正好可以解决我们的问题。

git-filter-repo的命令选项 (flag) 主要用来 *** 作目录树,根据 *** 作的目录树自动判断需要修改的git提交 历史 信息。

比如我们需要保留webapp目录,删除server目录,那么仅需执行:

这样仓库中的目录结构就会变为:

可以看到,已经没有server文件夹了。

再比如如果我们希望删除DS_Store文件以及其提交 历史 :

当然通常我们需要删除根目录下所有DS_Store文件及其 历史 ,那么可以加上--use-base-name选项,表示匹配文件名,而不是匹配完整路径:

其中 --path 选项后跟需要 *** 作的路径或者文件名,--invert-paths选项字面意思是反向,因此该标记表示的是删除 *** 作。

以上都是删除某些文件或者保留某些文件的 *** 作,其目录结构仍然会保留原始仓库的结构,但我们需要的是仅保留webapp目录下的所有文件,并将其中的内容移动到根目录下。针对这种场景git-filter-repo提供了一个叫做--subdirectory-filter的选项,接下来就进行实际 *** 作。

接下来再看一下老的仓库目录结构

仅保留webapp目录下的内容,并让其成为新的根目录,执行如下命令:

执行结果的目录结构如下所示:

至此,目录结构已经如愿完成,为了确认迁移的 历史 记录也是完整的,执行

如果确认本地仓库的迁移结果正确,再执行命令将当前本地仓库推向迁移的目的仓库即可:

至此我们的git项目迁移就完成了,不仅将代码迁移到新的仓库,也同时将提交 历史 带去了新的仓库。这样一来,对于开发同学来说迁移完全是无痛的,只是切换了新的git地址,而开发过程完全不会中断。

在git项目需要迁移的场景中,日常工作中也许第一反应就是让开发同学们放下手中的工作,全部推向一个指定用于迁移的分支,然后以这个分支为准,下载源代码,再将其推送到新的仓库中。

这种 *** 作方式虽然简单,但是对于开发同学来说,却会造成很多麻烦。

比如新仓库的代码不仅含有自己未开发完成的代码,也含有其他人未完成的代码,很有可能在迁移完成之后项目都跑不起来。

而除此以外,如果新仓库的代码有一个需要很快就上线的功能,或者紧急修复,面对一个百废待兴的新仓库,如何整理出一个可以上线的代码版本,又是一件非常头大的事情。

git-filter-branch可以帮助我们修改目录树和提交 历史 ,但是执行效率和混乱的提交 历史 显得太过于繁琐。

git-filter-repo工具提供了强大的工具集,良好的用户使用界面,以及高效率的处理机制,在目前确实是处理仓库迁移的最优选择。

本文仅仅是讲解了git-filter-repo的一种应用场景,其官方文档上有更多的使用场景,可以根据更多的条件来过滤和 *** 作文件和提交 历史 。

平时我会把所有需要储存的资料都用git进行管理

我需要使用一个命令, 把工作中所有git仓库都提交到自己的阿里云或Dropbox上, 在不同的地方使用它

使用git配合Dropbox的另外一个好处是, 由于 gitignore 忽略了许多公共资源, Dropbox只需要储存很少的内容:

如图, 我的所有项目文件有875GB, 但是Dropbox上只保存着430MB的仓库, 并且还拥有Git的版本管理功能

如果你有和我一样的需求, 这篇文章会帮到你

首先得确保当前有 Nodejs 环境, 安装 merge-sub-gits

思路很简单:

其中添加 -l 参数会打印重命名日志

每次都需要使用 merge-sub-gits 命令包括 git 提交 *** 作很是繁琐, 我们可以在 ~/bash_profile 文件中添加以下内容:

我们平时会有需要把工作文件放入各类网盘中, 方便在公司和家里进行同步, 但是Dropbox\iCloud等网盘都没有给予文件夹忽略和更细腻的Git的文件历史

例如一个React前端项目大概有几百MB, 如果忽略 node_modules 文件夹就只剩下十几MB

我们可以把所有工作和电脑环境相关的资料都放入一个work文件, 使用 merge-sub-gits 把改文件夹的内容同步到网盘中:

我们已经在Dropbox中创建了一个仓库, 并且clone到了本地, 接下来我们拷贝所有需要备份的文件都放入 ~/backup-all 文件夹中, 然后继续下面的 *** 作:

如前文所述, 通过gitignore文件和git的压缩, 把875GB的内容, 变为430MB进行网盘管理, 并且还有Git的版本管理功能

由于Git仓库中保存了许多历史信息, 随着长时间的使用, Git 仓库会缓慢的逐步增大, 由于我们所有子项目都保留着自己的Git历史, 所以如果有一天根Git仓库太冗余了, 我们只需要删除Dropbox的Git,重新提交即可

如果曾经在根git项目中使用过 git commit , 会把子git项目标记为忽略提交

这种情况需要清空git记录:

欢迎 Star: githubcom/ymzuiku/merge-sub-gits

以上就是关于码云管理项目版本控制的终端命令(git)全部的内容,包括:码云管理项目版本控制的终端命令(git)、利用gitrepo无缝迁移git项目、一个Git仓库管理多个Git项目等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10091160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存