[解決済み] ある Git リポジトリから別のリポジトリにコミットをコピーするには?
質問
先週、Githubのレポを作成したのですが、レポのライセンスを選択するのを忘れていました。現在、すでに3つの大きなコミットがあります。
3人の貢献者に、レポを削除してから同じ名前で再度作成し、今度はレポ作成時にライセンスを選択してもよいか尋ねると、彼らはそれでいいと言いました。
質問事項
新しいリポジトリにコミットして(今回は最初のコミットがLICENSEファイルです)、コミットのメタ情報を維持する方法はありますか?
どのように解決するのですか?
<ブロッククオート新しいレポにコミットして(今回は最初のコミットが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を追加したい場合です。
はい、LICENSEコミットを最初のコミットとして配置することができます。
リベースとは、コミット作者とコミット日時をすべて維持したままコミット順を並べ替えるギッツ流の方法です。
共有レポで作業する場合、チーム全員がgitに精通していない限り、一般的には推奨されません。そうでない人は、リポジトリの新しいコピーをクローンすればいいのです。
最初のコミットとしてLICENSEコミットを取得する方法を説明します。
1. ローカルコピーの更新とリベース
プロジェクトをチェックアウトし、LICENSE ファイルを現在の 3 つのコミットスタックの一番上にコミットしてください。
#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'
その後、master ブランチ上で対話的にリベースを行い REARRANGE のコミットです。
git rebase -i --root
エディタが立ち上がります。 一番下の行(あなたの "Initial commit" 直近のコミット)をファイルの一番上に移動してください。その後、保存してエディタを終了します。
エディタを終了すると同時に、git は先ほど指定した順番でコミットを書き込んでいきます。
これでリポジトリのローカルコピーが更新されました。 を実行します。
git log
をクリックして確認します。
2. 新しいレポの状態をgithubに強制プッシュする
コピーが更新されたので、それを github に強制的にプッシュします。
git push -f origin master
これは、github に master ブランチを新しい場所に移動するよう指示します。 強制的にプッシュするのは、このように作業している全員が保留中の変更に気づいているような稀なケースに限ります。
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
これで終わりです。 これでみんな同期しているはずです。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git のローカルコミットを破棄する
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
LinuxでSteamをダウンロードしインストールする方法
-
Linuxのデスクトップの背景を画像で引き伸ばし表示にする方法とは?
-
deepin linuxでroot権限に切り替えるには?Deepinでrootに切り替えるためのヒント
-
LinuxでJenkinsプラグインのインストールが遅い場合の解決策
-
deepin depth systemはどのような内容でアップデートされましたか?deepinの最新版アップデート内容まとめ
-
TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] 特定のファイル/フォルダを除外してディレクトリをtarするシェルコマンド
-
[解決済み】Git リポジトリのサブディレクトリの Git ログ履歴(関連するすべてのコミット)を表示する方法
-
[解決済み] git: あるレポのコミットによる変更を別のレポに適用する