2015-06-01 12 views
6

Sono un nuovo programmatore in una squadra. E al mio primo giorno ho questo file rinominato all'interno di uno stadio, pronto per essere commessi da git:File rinominati all'interno git

$ git status 
On branch master 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     modified: .gitignore 
     new file: reports/SQLS.rar 
     renamed: account/enter_rules.php -> enter_rules.old.php 

Changes not staged for commit: 
    (use "git add/rm <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory)  
     deleted: account/enter_rules.old.php 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

     account/enter_rules.php 

Per le prime 2 righe non ho alcun problema. So cosa sta succedendo. Ma per l'ultimo rinominato:, non sono sicuro di cosa si debba fare. Il sistema funziona bene.

All'interno della directory di lavoro che ho:

account/enter_rules.php 

non riesco a trovare il file enter_rules.old.php.

Sembra che l'altro programmatore abbia creato una copia dal file, chiamata reale come .old, fatta alcuni test e nuovo codice, che ha messo in scena le modifiche e ha dimenticato di eseguire il commit. Di quanto ha eliminato manualmente il vecchio.php

Quale dovrebbe essere l'approccio migliore per affrontare questa situazione? Vorrei mettere in chiaro lo stato di git prima di iniziare a lavorare su di esso e apportare le mie modifiche.

Ho trovato questo post ma non sono sicuro se dovrei o potrei impegnarmi nella mia situazione. Handling file renames in git


Dopo leggere tutti i suggerimenti, che mi hanno aiutato molto, questo è quello che ho fatto:

  1. Ho appena fatto una copia (solo per sicuro) dal file enter_rules.php
  2. I " detto "to git (all'INDICE) che il nome del file è stato cambiato. $git commit -m "committing name changes". A questo punto non lo so, è stato cancellato .old.
  3. Quindi ho digitato $git rm "account/enter_rules.old.php" per risolvere la riga: Modifiche non organizzate per il commit:. Allo stesso modo usiamo $git add . per "dire" a git di tracciare un <file>, dovremmo usare $git rm <file> per "dire" a git di dimenticare questo <file>.
  4. Quindi ho digitato $git status e ho ricevuto il messaggio VERDE: eliminato: account/enter_rules.old.php. Quindi dovrei dire all'indice che il file .old è stato rimosso. Ho digitato $git commit -m "committing delete changes"
  5. Ora git sa che enter_rules.php stato rinominato in enter_rules.old.php e poi enter_rules.old.php è stato rimosso (cancellato).
  6. Quindi ho risolto l'ultima riga (File non tracciati :). Ho appena detto di creare un nuovo file creato e chiama enter_rules.php. Ho aggiunto e commesso come dovrebbe essere.

Tutti i suggerimenti mi hanno aiutato a risolvere il problema, quindi cercherò di essere giusto e darò il controllo a chi ha meno punti.

+0

Questo è molto strano. In base a ciò che stai dicendo e a quale 'stato git' mostra, sembra che il tuo collega abbia eseguito' git mv enter_rules.php enter_rules.old.php' e poi copiato quel file su enter_rules.php? Perchè lo farebbe? – DIMMSum

+0

Giusto per essere chiari. Non * hai bisogno di 'enter_rules.old.php' ma hai bisogno di' account/enter_rules.php', corretto? – DIMMSum

+0

Ciao Decavo, ho cambiato le informazioni. Dovrei incollare tutto l'output git. Sembra che abbia creato una copia dal file e abbia chiamato .old.php. Di lui ha apportato alcune modifiche nel codice. Forse ha funzionato. Poi ha cancellato il file .old e aggiunto allo stage. Non so esattamente cosa sia successo. Ma ora ho questa situazione che vedi nel git dell'output. – zwitterion

risposta

1

Mi sembra chiaro a me quello che è successo qui:

Nello stato iniziale c'erano due file account/enter_rules.php e account/enter_rules.old.php.

Il suo collega deve aver fatto qualcosa di simile:

git rm account/enter_rules.old.php 
git mv account/enter_rules.php account/enter_rule.old.php 

poi editate un nuovo account/enter_rules.php e lo ha lasciato non è stato classificato.

Se siete ok con i cambiamenti appena

git add account/enter_rules.php 
git commit 

altro

rm account/enter_rules.php 
git reset HEAD 

per annullare i suoi cambiamenti.

Che suono strano per me è perché stai lavorando sul clone del repository di un collega con modifiche non vincolanti?

+0

Come ho detto. Sono appena arrivato nella squadra. Quindi sto sostituendo un altro programmatore. Mi aspettavo di ricevere tutto ok. Basta cancellare per iniziare a codice. – zwitterion

+0

Sembra che abbia lasciato il lavoro senza terminare l'operazione (la media indica tutte le modifiche) – zwitterion

1

Anche se git dice che enter_rules.old.php è stato rinominato, si dice anche che è stato eliminato sotto:

Changes not staged for commit: (use "git add/rm <file>..." to update 
what will be committed) (use "git checkout -- <file>..." to discard 
changes in working directory)  
     deleted: account/enter_rules.old.php 

Ciò significa che il file è andato, e affinché git applicare tale eliminazione al repository, la l'azione di rimuoverla deve essere inclusa nel commit. Poiché il cambiamento è tracciato, ma non messo in scena, è possibile eseguire questo con un semplice comando (descritto di seguito nella parte 3).

  1. Aggiungere il file in account/enter_rules.php utilizzando git add account/enter_rules.php.
  2. Se si esegue git status di nuovo, enter_rules.old.php deve essere contrassegnato per la cancellazione e account/enter_rules.php deve essere messo in scena per essere eseguito il commit.
  3. Eseguire git commit --all per confermare tutte le modifiche graduali.

Eseguendo git commit --all, questa operazione consente anche di eseguire la cancellazione eseguita dal collaboratore ma che non è stata eseguita da sola.

Sembra che il tuo collaboratore abbia utilizzato git mv per rinominare il file, quindi lo ha eliminato ma non ha organizzato l'eliminazione.

1

Git non funziona sui file nella cartella di lavoro. Invece, se funziona su qualcosa chiamato "indice". Ciò significa che puoi cambiare i file, inserirli nell'indice ("presto, mi piacerebbe ...") e rendere l'indice permanente con git commit.

Il vantaggio principale qui è che è possibile raccogliere molti cambiamenti nell'indice con singoli comandi (come quando si sono apportate diverse modifiche e si desidera inserirle in commit individuali). Questo processo è chiamato "staging". git add funziona sull'indice, ad esempio.

Che cosa è successo nel tuo caso è:

  1. è stato rinominato il file (probabilmente nel vostro IDE) e detto Git "mettere in scena" il cambiamento. Git ricorda questo nell'indice.
  2. Hai cancellato il file senza dire a Git
  3. Hai una copia di account/enter_rules.php da qualche parte e la copia nella tua cartella di lavoro, anche senza dirlo a Git.

Per Git, la situazione è ora che sa che c'era una volta un file enter_rules.old.php che si voleva commettere. Puoi farlo perché Git si ricorda abbastanza per farlo davvero.

Allo stesso tempo, lo spazio di lavoro è cambiato molto. Il file di staging è sparito e una nuova copia è apparsa. Dal momento che Git non può leggere la tua mente, non prova a capire cosa potrebbe significare. Elenca solo i fatti.

Ora per ripulire:

Per rendere Git dimenticare la ridenominazione per enter_rules.old.php, utilizzare git reset HEAD enter_rules.old.php

Ora dovrebbe ricordare che account/enter_rules.php viene monitorato. Se hai cambiato questo file, lo mostrerà come modificato. Esegui git status per essere sicuro.

+1

molto probabilmente passaggi '2' e' 3' dove in realtà basta rinominare il file, ma senza dirlo a proposito ... –

+1

@ umläute Ah sì, questo ha senso –