GNU/Linux >> Linux の 問題 >  >> Linux

ある Git リポジトリから別のリポジトリにコミットをコピーする方法は?

github にレポをフォークするのを忘れて、自分の間違いに気付く前にいくつかのコミットを追加したという同様の問題がありました。

とても簡単な解決策を見つけました。

最初に元のレポへのリモートを削除します

git remote remove origin

次に、github の新しいフォークにリモートを追加します

git remote add origin <my repo URL>

次に、オリジン マスターにプッシュすると、すべてのコミットが github に表示されました。


<ブロック引用>

コミットを新しいレポ (今回は最初のコミットは LICENSE ファイル) に取得し、コミットのメタ情報を保持する方法はありますか?

はい、リモートを追加し、最初のコミットの上にコミットをチェリーピックすることによって。

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo

# get the old repo commits
git remote update

# examine the whole tree
git log --all --oneline --graph --decorate

# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three

# check your local repo is correct
git log

# send your new tree (repo state) to github
git push origin master

# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

この回答の残りは、ライセンスを以前のリポジトリに追加したい場合です。

はい。リベースすることで、LICENSE コミットを最初のコミットとして配置できます。

リベースは、すべてのコミットの作成者とコミットの日付をそのまま維持しながら、コミットの順序を再配置する git の方法です。

共有リポジトリで作業する場合、チーム全体が git に精通していない限り、一般的に推奨されません。そうでない場合は、リポジトリの新しいコピーを複製できます。

最初のコミットとして LICENSE コミットを取得する方法は次のとおりです。

1.ローカル コピーを更新してリベースする

プロジェクトをチェックアウトし、LICENSE ファイルを現在の 3 つのコミット スタックの一番上にあるコミットに配置します。

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

次に、マスター ブランチで REARRANGE へのインタラクティブなリベースを行います

git rebase -i --root

エディターが開きます。一番下の行 (「最初のコミット」コミット、最新のコミット) をファイルの先頭に移動します。次に、エディターを保存して終了します。

エディターを終了するとすぐに、git は指定した順序でコミットを書き込みます。

これで、リポジトリのローカル コピーが更新されました。する:

git log

確認します。

2.新しいリポジトリの状態を強制的に github にプッシュ

コピーが更新されたので、強制的に github にプッシュする必要があります。

git push -f origin master

これにより、マスター ブランチを新しい場所に移動するように github に指示されます。プッシュを強制するのは、このようなまれな場合に限ってください。プッシュを強制するのは、作業を行っている全員が保留中の変更を認識しているためです。そうしないと、共同作業者を混乱させることになります。

3.共同編集者を github に同期

最後に、すべての共同編集者がこのリポジトリに同期する必要があります。

まず、クリーンなリポジトリが必要です 保存されていない変更がある場合、次のコマンドは破壊的な可能性があるためです。

# make sure there are no unsaved changes
git status 

# pull the latest version from github
git fetch  

# move their master branch pointer to the one you published to github.
git reset --hard origin/master

それでおしまい。全員が同期しているはずです。


Linux
  1. 最後のN行をあるファイルから別のファイルにコピーしますか?

  2. ある mysql データベースから別の mysql データベースにテーブルをコピーする方法

  3. フォルダ構造 (ファイルなし) をあ​​る場所から別の場所にコピーする

  1. あるディレクトリから別のディレクトリに最新の上位 10 個のファイルをコピーする方法は?

  2. Linux / Unixで複数のファイルの名前をある拡張子から別の拡張子に変更する方法は?

  3. ある Linux サーバーから別の Linux サーバーに大きなファイルをコピーする

  1. Linuxで特定の種類のファイルを検索してあるディレクトリから別のディレクトリにコピーする方法

  2. すべてのファイル(非表示を含む)をあるディレクトリから別のディレクトリに移動するにはどうすればよいですか?

  3. あるマシンから別のマシンに設定をコピーする方法は?