Hur forcerar jag en Git-push på rätt sätt?

Jag har satt upp en fjärrkontrollerad icke-bara "main" repo och klonat den till min dator. Jag gjorde några lokala ändringar, uppdaterade mitt lokala förråd och tryckte tillbaka ändringarna till min fjärrrepo. Allt gick bra fram till dess.

Nu var jag tvungen att ändra något i fjärrrepo:n. Då ändrade jag något i min lokala repo. Jag insåg att ändringen i fjärrrepo:n inte behövdes. Så jag försökte git push från min lokala repo till min fjärrrepo, men jag fick ett fel som:

För att förhindra att du förlorar historik, har icke-snabbt-vidarebefodrade uppdateringar avvisas Sammanfoga fjärrändringarna innan du pushar igen. Se 'Anmärkning about fast-forwards' i avsnittet git push --help för mer information.

Jag trodde att det förmodligen var en

git push --force

skulle tvinga min lokala kopia att flytta ändringar till den fjärrkontrollerade kopian och göra den likadan. Det tvingar fram uppdateringen, men när jag går tillbaka till fjärrrepo:n och gör en commit märker jag att filerna innehåller föråldrade ändringar (sådana som fjärrrepo:n tidigare hade).

Som jag nämnde i [kommentarer till ett av svaren] (https://stackoverflow.com/questions/5509543/how-do-i-properly-force-a-git-push#comment6275726_5509588):

[Jag] försökte forcera, men när jag går tillbaka till huvudservern för att spara ändringarna får jag föråldrad staging. När jag lägger in är alltså inte repositorierna samma. Och när jag försöker använda git push igen får jag samma fel.

Hur kan jag åtgärda detta problem?

Lösning

Gör det bara:

git push origin  --force

eller om du har en specifik repo:

git push https://git.... --force

Detta kommer att radera dina tidigare commit(s) och pusha din nuvarande.

Det kanske inte är riktigt, men om någon snubblar över den här sidan och tänkte att de kanske vill ha en enkel lösning...

Kort flagga

Notera också att -f är en förkortning för --force, så

git push origin  -f

fungerar också.

Kommentarer (12)

Först och främst skulle jag inte göra några ändringar direkt i repo "main". Om du verkligen vill ha en "main" repo, bör du bara pusha till den, aldrig ändra den direkt.

När det gäller felet du får, har du försökt med git pull från din lokala repo, och sedan git push till huvudrepoen? Det du gör för närvarande (om jag har förstått det rätt) är att tvinga fram push och sedan förlora dina ändringar i huvudrepoen. Du bör sammanföra ändringarna lokalt först.

Kommentarer (4)

Jag skulle verkligen rekommendera den till:

  • endast till huvudrepo:n

  • se till att huvudrepo är en bare repo, för att aldrig ha några problem med att huvudrepos arbetsträd inte är synkroniserat med dess .git-bas. Se "Hur man pushar ett lokalt git-förråd till en annan dator?"

  • Om du måste göra ändringar i huvudrepoen (bare repo), klona den (på huvudservern), gör dina ändringar och push tillbaka till den.

Med andra ord, håll en bar repo tillgänglig både från huvudservern och den lokala datorn, för att ha en enda uppströmsrepo från/till vilken du kan dra/dra.

Kommentarer (1)