¿Cómo puedo reproducir mis confirmaciones de un repositorio local de Git, en la parte superior de un proyecto en el que se bifurcó en github.com?

StackOverflow https://stackoverflow.com/questions/1457248

  •  12-09-2019
  •  | 
  •  

Pregunta

Sí, ya sé que debería haber simplemente en forma de horquilla del proyecto desde el principio, pero esto es lo que la situación que estoy ahora. :)

Tengo un repositorio Git local que contiene mi blog, en mi equipo local, que tiene varios meses de cometer historia. Originalmente, simplemente descargado los archivos del repositorio http://github.com/mojombo/mojombo.github.com , y yo continuó con mi repositorio Git local, con el primer comprometer el aspecto de los últimos archivos desde el repositorio de mojombo.

Ahora me gustaría que bifurcar el proyecto y tener mi repositorio Git local, comete ser reproducido en la parte superior de la misma, por lo que parece que se bifurcó el proyecto desde el principio, y luego empujó de nuevo a mi versión bifurcada del repositorio de mojombo, en mi cuenta de GitHub:

http://github.com/program247365/mojombo.github.com

Así que tal vez la historia sería el siguiente aspecto:

mobjombo repository:         1---2---3----23
                                  \
my blog repository commits:       24---25---

¿Qué comandos de Git puedo utilizar exactamente para hacer esto?

He mirado en esta pregunta . Voy a tener que añadir el repositorio de mojombo como un control remoto para mi proyecto, y tire de ella en, fusionar, resolver conflictos, y luego empujar a mi proyecto bifurcado en GitHub?

¿Fue útil?

Solución 2

Cuando traté git pull me dio el siguiente error:

$ git pull grid master:master
! [rejected]        master     -> master  (non fast forward)

En mi caso particular, parecía que git rebase era el camino a seguir para mí, como lo muestran los pasos aquí:

#Clone my forked project from github
git clone git@github.com:program247365/mojombo.github.com.git 

#Add my repo as a remote repo, with the alias 'grid'
git remote add grid "path/to/remote/gitrep/with/all/history/unrelated/to/mojombo/" 

#Rebase my commits on top of mojombo's
git rebase master grid/master

#Switch to the local master branch 
git checkout master

#Call up my mergetool via git, to start rectifying the conflicts that emerge between my repo, and mojombo's
git mergetool

#Push my rebased/combined repo back to Github.com
git push github

Otros consejos

En resumen:

Una solución es utilizar injertos para conectar la historia, a continuación, utilizar git filter-branch reescribir la historia de acuerdo con esos injertos, a continuación, opcionalmente hacer un fusionar .

Tenga en cuenta que la solución para reproducir los cambios (que realiza poco) encima de los nuevos desarrollos en el repositorio original (el rebase solución) es otra solución viable.


versión más larga:

Vamos a suponer que o bien recuerda, o usted puede encontrar mediante el examen de la fuente y / o el uso de los comandos de Git la revisión del repositorio que ha descargado instantánea de, y comenzó el desarrollo local. Vamos a llamar a esta revisión o START A.

Vamos a suponer que la historia local es desconectado en el clon del repositorio inicial. Esto significa que el desarrollo local es desconectado en el mismo repositorio que la historia completa de un proyecto. Vamos a suponer que usted ramas locales están en la bifurcación 'maestro' (y para simplificar, que sólo hay una rama).

Si lo hizo proyecto no exagerado en el repositorio con su trabajo desconectado local, puede hacer esto con:

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

La historia se ve ahora como lo siguiente:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)

                                     x---y---*---*---*      <--- master (your local disconnected history)

El cometer un llamado en el diagrama de arriba es el comienzo de Confirmar descargar como instantáneas y comenzó su desarrollo local fuera.

Hay dos posibilidades:. Has comitted instantánea de 'A' como inicial cometer 'x', o el primer compromiso que hizo fue con sus modificaciones locales

En primer caso (que cometió estado de partida original, por ejemplo, como 'inicial cometer' o 'importación') le gustaría que la historia conectado con el aspecto siguiente:

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)
                                      \
                                        \-y---*---*---*       <--- master (your local disconnected history)

es decir. el primer original comprometerse 'y' para tener 'A' como padre.

En el segundo caso (usted comprometido con los cambios) le gustaría que la historia conectado a este aspecto en su lugar:

*---*---*---*---*---A---*---*---*---*           <--- origin/master (remote-tracking branch)
                                      \
                                        \-x---y---*---*---*      <--- master (your local disconnected history)

es decir. que desea comprometerse primero 'x' tener 'A" como padre.

En ambos casos usted quiere encontrar completa SHA-1 identificador de cometer 'A', y lleno SHA-1 identificadores de 'x' compromete y 'y'.

Puede encontrar SHA-1 de cometer 'A' (suponiendo que no lo saben ya) con git rev-analizar :

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

(la '^ {commit}' podría ser necesario sufijo para asegurarse de que ha encontrado comprometerse SHA-1, lo cual es importante si, por ejemplo, sabe 'A" por su etiqueta, por ejemplo' v0.99' .; en su caso, no es necesario, como el depósito en cuestión no utilizar etiquetas)

Puede encontrar SHA-1 de confirmaciones 'x' e 'y' usando git rev-list (suponiendo que el desarrollo se hizo en 'maestro' rama):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

(el "| tail -2" está aquí para encontrar dos últimos comete en la lista generada; no es necesario usarlo si no lo tiene).

Nota: en todos los ejemplos anteriores completo SHA-1 son ejemplos , y no debe utilizarse como es

Vamos a nombrar la confirmación de que desea tener 'A"(o 'START') como uno de los padres como los primeros (que sería 'x' o 'y', en función de que el caso, como se ha dicho). Ahora utilizar injertos mecanismo para conectar la historia:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

A continuación, usted debe comprobar si ya ha conectado correctamente (unido) la historia, mediante el uso del navegador historia gráfica como gitk o QGit o GitX es que está en MacOS X, o incluso "git log --graph", o "git show-branch", por ejemplo:

$ gitk master origin/master    # or --all

(donde gitk es sólo a modo de ejemplo, si se utiliza "git show branch" no siempre se puede utilizar la opción '--all').

Por último probablemente nos quieren hacer los cambioss permanente, así que cualquiera que se vendería en nuestro repositorio también habría conectado la historia. Podemos hacer esto mediante el uso de git del Filtro rama :

$ git filter-branch master

Usted tendría la historia original, (desconectado) en 'refs / Original / master'.

Archivo Ahora se pueden eliminar los injertos:

$ rm .git/info/grafts

Ahora usted sería capaz de fusionarse en el nuevo desarrollo para el repositorio original:

$ git merge origin/master

Configuración de configuración de cada rama, por lo que sería suficiente para hacer simplemente "git pull", cuando el 'maestro' rama de tirar (Merge) cambios en el origen (al) repositorio se deja como ejercicio para el lector .. .: -)


Nota: rebase solución resultaría en la historia siguiente (suponiendo que tenemos caso en el primer punto de Comit era la importación sencilla):

*---*---*---*---*---A---*---*---*---*                                      <--- origin/master (remote-tracking branch)
                                                                     \
                                                                       \-y'---*'---*'---*'      <--- master (your local disconnected history)

(donde medios y' que cometen y se modificó: debe ser aproximadamente el mismo conjunto de cambios, pero es diferente como un commit).

Aquí hay una reflexión sobre lo que podría hacer. Es un poco lo contrario de la idea que resume al final de su pregunta.

  1. repo de mojombo Tenedor en GitHub.
  2. Clonar su copia bifurcada.
  3. Combinar en sus cambios de su repositorio existente (el original).
  4. Eliminar el repositorio original (si se desea, pero que realmente no lo necesita más).

Así que, básicamente, después de que se bifurcan en GitHub, es posible utilizar la siguiente secuencia de comandos:

$ git clone git://github.com/$YOUR_USERNAME/$YOUR_PROJECT.git  # Clone your GitHub fork (#2 from above)
$ git pull /path/to/your/original/repo master:master           # Clone your original repo's master branch into your new repo (cloned from GitHub)
$ rm -rf /path/to/your/original/repo                           # Might as well delete the original -- you don't need it anymore, since all your history is in your new repo

En resumen, este método se fusionarán en todos los cambios que ha realizado en el repositorio de más edad (preservando así su historia de desarrollo), y al mismo tiempo tirando de la historia de mojombo, y lo que le permite mantenerse al día con los cambios de mojombo / contribuir fácilmente los cambios de nuevo a su cesión temporal, en su caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top