将本地非git工作合并到远程git存储库

时间:2017-09-16 16:08:32

标签: git merge local rebase

我想将我的工作从非git启动的文件夹与远程git存储库合并。

以下作品:

git init
git add
git commit

git remote add origin [url]
git fetch
git rebase origin/master
git push -u origin master

另一种选择是:

git init
git add
git commit

git remote add origin [url]
git pull --allow-unrelated-histories origin master
git push -u origin master

但是--allow-unrelated-histories很难写(git' s创作者不想实现快捷方式,因为"它是一个罕见的情况")我听说它更好在这种情况下,做一个rebase而不是merge。

你知道更快的方法吗?

修改
长版本:

我心甘情愿地跳过了工作流程部分直截了当,但这是我的工作流程,以了解原因(我记住你推荐的工作流程,但我不确定它适用于我的情况):

  • 我的网站代码在ftp上
  • 我直接在ftp上工作,因为它对我来说更方便
  • 我将ftp文件夹拖放到桌面上并运行git命令将我的local-ftp更改与我的协作者-GitHub合并。

为什么我直接在ftp上工作:
- 所有集成在我的IDE中,我都可以进行修改"在飞行中"用一个软件
- 没有本地服务器使用
- 没有从本地到ftp的转移(除非合作者在GitHub上进行了更改)
- 网站的应付插件不是我的处置localy所以我不能有一个适当的本地测试环境
- 我曾经在localy工作但是当我因任何原因将代码转移到ftp时结果不同

我同意这可能是"手工制作"喜欢,但是因为我独自在代码上工作,所以它做得很好。现在还有另一个人,所以我们把代码放在GitHub上,然后用我提到的git命令解决了代码之间的同步问题。我有写代码的权限,所以我不需要fork / pull请求。我不需要永久保留当地的回购,所以我更喜欢擦拭它,但是如果SCM需要我保留我所有项目的本地回购,我会这样做,但是......我不会...喜欢它,因为我不需要它,这就是我在第一条消息中找到解决方案的原因。

你认为我应该有更好的工作流程吗?你是否认为我们应该在不同的分支上工作,即使是微小的变化(如果它允许我有一个更清晰的历史我会做,因为我喜欢保持有组织和精益,这就是为什么我使用rebase而不是合并)?

事实上,大背景问题是:大型团队如何将他们的GitHub代码与他们的ftp代码同步(并且在更新repo和实际的ftp repo之前检查新的GitHub代码在测试ftp文件夹上是否正常)?愚蠢的问题:他们是否从ftp做SCM(如何?这会很棒)?

我是SCM的新手,我问自己所有这些问题......

2 个答案:

答案 0 :(得分:1)

  

你知道更快的方法吗?

这是一个错误的问题。正确的问题是:是什么驱使您在SCM之外做任何工作 - 在本地或远程回购之外?

什么是最快"将您的工作与远程仓库同步的方式是合法的,但由于您还没有提供有关工作流程的任何详细信息,我们无法确定答案。

我会推荐这个工作流程:

  1. 如果在Github上 - 首先分叉远程仓库
  2. 在对本地PC进行任何工作之前克隆远程仓库(或您的前叉),这样您就可以在本地仓库中工作。
  3. 为将来合并的此功能/输出创建分支
  4. 在分支机构中完成所有工作,提交并以其他方式利用Git的SCM创建历史记录并随时恢复变更的能力
  5. 如果其他人因任何原因(例如,如果您寻求帮助)能够看到正在进行的工作并为您提供备份,请定期将您的分支推送到远程。
  6. 准备好合并时,只需发出拉取请求(如果适用)(或在您自己的分支中),并允许进行代码/工件审查;或者,如果该项目如何运作,只需合并为主人。
  7. 我们可能会推荐一些其他策略来提供更多详细信息,但我认为您必须将事情变得更加复杂,特别是在合并与rebase问题方面,这必然意味着您的远程仓库,唯一的分支是主(!) - 您是否熟悉维护多个开发实验分支的Gitflow模型?您是否熟悉在Git中分支和合并有多容易?

    Git是为分布式源代码管理而制作的 - 所以请用它! (即在开发过程中在本地使用它。)

    针对问题

    添加的较长历史记录进行了更新

    如果我理解你的情况,我认为上述情况仍然可以正常进行。我建议在你的本地PC上创建一个Github仓库的镜像,你总是把它保存在那里。您仍然可以通过FTP在服务器上进行所有更改,因为您说这样更方便 - 但我要小心,因为那时(如果我理解的话),您正在更改实时网站。如果这适用于你的情况(包括没有首先测试新版本这样做的危险),那么这很好。

    鉴于您的具体情况,我尝试以下两种方式 - 但我不能100%确定Git将如何与FTP交互(即希望它不会刷新现有文件的日期)或导致Git将其视为已更改的任何其他内容)

    1. 继续做你正在做的事情 - 除了在你的本地电脑上留下一个loco repo。此方法只会将您的更改作为新提交转储给master。

      • 对FTP站点进行新的更改
      • 准备好将更新添加到存储库时,请先从本地服务器获取远程服务器,以便在从FTP下载之前获取远程服务器上的任何新提交。
      • 将您的更改从FTP下拉到本地仓库,只需覆盖任何现有文件。如果按照我的想法运行,那么git状态将仅显示此时已更改的文件。
      • 执行git add .将所有更改添加到索引
      • 承诺掌握您的更改
      • 推送到远程,这应该只是添加新的提交以及对遥控器的新更改。如果其他人在您的抓取和推送之间提交,则发生冲突的可能性很小。
      • 冲洗并重复
    2. 转到分支策略。仍然保留当地的回购

      • 提出一些分支策略,回购中的每个人都同意(听起来像是你们两个人)。在这种情况下,我可能会建议你只有一个与主人分开的分支,可能只是用你的名字或者' dev' web'等等(简短易用的东西!)
      • 或者,您可以为每个更改进行分支,但这听起来有点矫枉过正。
      • 您对网站所做的任何更改,您都可以从FTP下载并添加/提交到您当地的分支机构。
      • 每当你想要合并到master的提交时,都要进行提取,合并,然后拉动。
      • 优势1:您可以根据需要随时提交本地存储,这将存储任何更改的历史记录,并允许您随时恢复以前的提交在FTP站点上出错。
      • 优势2:您的单独分支将在远程仓库上重复,以便所有各方都可以查看该分支的历史记录,合并完成时等等,如果问题的历史记录需要跟踪。
      • 优势3:如果需要,您仍然可以始终与分支机构的拉取请求合并,如果有多个人尝试合并,则应该避免任何冲突(即让维护远程的人员决定何时合并,或者如果有问题则打开通信)。换句话说,你不负责主分支,你可以住在你的分支机构。
    3. 如果这一切看起来都不适合你 - 我会尝试另外发布的另一个解决方案。每次都不应该删除本地仓库,这样甚至可以省去一步,我想 - 或者只是让它成为一个获取而不是克隆?

答案 1 :(得分:0)

我真的认为我的另一个答案更好,但是这里有一个替代方法可以完全按照你的要求......

在您的开发文件夹的父级中,该文件夹不在回购中:

> git clone [repo URL]
> cd [repo name]
> mv ../[folder name of your stuff] .
> git add .
> git commit -m "added my stuff in folder [folder name of your stuff]"

基本上,你正在克隆repo 第一个,然后将你的开发文件夹移动到repo中,添加它,并将它提交给你需要的任何分支(我在这里假设了master)。

这可能会更短,可能更清晰 - 更容易理解,因为您在回购已经存在之后添加项目,因此您没有不同历史记录的单独主分支。

编辑:鉴于更新的历史记录,您甚至可以通过FTP直接从网站服务器直接进入本地仓库(而不是强制{{1})来缩短这一点。 }命令。

您也可以随时离开本地回购,只需将克隆更改为提取。

相关问题