Файлды тіркеуден басқа филиалға тапсырыңыз

Бұл филиалды тексеру арқылы гиттің филиалында файлды жасауға болады ма? Қалайша?

Шын мәнінде, файлды әрқашан филиалдарын алмастан, менің Github беттерінің бөлімінде сақтап қалғым келеді. Кез келген ойлар?

Update: It's not possible to do what I want (see comments below for use case). What I ended up doing is programmatically cloning my current directory to a tmp directory, then checking out my branch in that tmp directory (doesn't affect my working directory) and committing my files to the tmp directory clone. When I'm done, I push back to my working directory and delete the tmp directory. Sucks, but it's the only way to commit files to another branch without changing the current working branch of the working directory. If anyone has a better solution, please feel free to add it below. If it's better than 'it cannot be done', I'll accept yours.

27
Клондарда бірдеңе істеу дұрыс емес; егер олар жергілікті болса, онда ол қиындықтарды пайдаланатын болады және қосымша жұмыс ағашының көшірмесімен қатар қосымша дискілік кеңістікке ие болмайсыз. Егер сіз басу/тарту керек болмаса, < екі жұмыс ағашын .git-дағы символдар арқылы репо бөлісу үшін go-new-workir .
қосылды автор Cascabel, көзі
git commit -b branch_name ... сияқты нәрсені жасауға ешқандай мүмкіндік жоқ.
қосылды автор wkl, көзі
@KingCrunch: Осындай бола отырып, компиляция немесе тестілеу жоқ, қауіпті даму тәжірибесі
қосылды автор CharlesB, көзі
@Schneems: Сіз мұны қате түрде жасап жатсаңыз, осы жұмыс процесіне қосымша мәліметтерді қосыңыз, мен дәл сіз не істеп жатқаныңызды түсінбеймін
қосылды автор CharlesB, көзі
Мен үшін ең жақсы тәсілі - бұл екінші классты дұрыс филиалмен бірге ұстау. Бұл .git каталогы қысылғандықтан және беттер жиі жартысы болса, ол тым көп дискілік кеңістікті пайдаланбайды, егер бұл алаңдаушылық туғызады. Сондықтан сіз жасаған дұрыс нәрсе - дұрыс каталогқа көшу. Оны басқа клонға итермелеуге және «күрделі клонның биіне» жетудің қажеті жоқ, оны әдеттегідей желіге қосыңыз және сіз басқа клондарды қарапайым алу арқылы синхрондай аласыз.
қосылды автор Jean-Bernard Jansen, көзі
Бір қате пайда болды, қате таптым, тез түзетілдім, бірақ оны ағымдағы шығарылым тармағының орнына develop түрткіңіз келеді. Кем дегенде, бұл мүмкіндікті жіберіп алғанымның себебі;)
қосылды автор KingCrunch, көзі
@gustavotkg Мен фондық режимдегі файлдарға арналған файлдарды бағдарламалы түрде синхрондап отырамын. Мен филиалды тексермей-ақ жасауға мүмкіндігім болуы керек, себебі филиалды тексеру ағымдағы қолданыстағы филиалға әсер етеді. Енді клондар мен темптерлердің күрделі биін жасап жатырмын және шынымен де жасағым келгенде, қолданушының ағымдағы филиалына әсер етпестен бір файлды қосу керек.
қосылды автор Schneems, көзі
Неліктен басқа филиалды құттықтағыңыз келмейді? Сізде күтпеген өзгерістер болғандықтан бе?
қосылды автор gustavotkg, көзі
@Schneems Реподағы фонды пайдалану үшін басқа пайдаланушының репо көшірмесінің болуы мүмкін. Осылайша сіз реподағы фондық өзгерістерді сілтеме жасаған тармақтарды пайдаланып, жұмыс істейтін репо операциясына бағыттай аласыз
қосылды автор gustavotkg, көзі
@KingCrunch сіз go stash , go go checkout develop , қатені түзетіңіз go commit , go checkout одан кейін go stash pop параметрін өзгертіңіз
қосылды автор gustavotkg, көзі

9 жауаптар

Бұл мүмкін емес.

Сіз жасаған өзгерістер ағымдағы жұмыс көшірмесімен байланысты. Егер сіз басқа филиалға барғыңыз келсе, ол жұмыс көшірмесінен өзгертулер жасай алатыныңызды білдіреді, бірақ оларды басқа көшірме жағдайына негіздейді.

Бұл сіздің жұмысыңызды нұсқаудың табиғи тәсілі емес, сондықтан оны орындау үшін әртүрлі қадамдар жасау қажет (сташ өзгерістер, филиалды тексеру, поп-сташ және тапсырма).

Арнайы пайдалану жағдайына қатысты, сіздің жұмысыңыздың екі данасын master бөлімінде, ал екіншісі pages бөлімінде тексерілген жөн.

pages жұмыс көшірмесінде қашықтағы репо ретінде master көшірмесін қосыңыз.

  • You commit pages on master
  • Pull from master on the pages copy
  • push to GitHub
  • reset the master branch at its previous state.
16
қосылды
Бұл жауап қалай дұрыс? Сіз жасаған өзгертулер сіздің жұмыс жасайтын көшірменің ешқандай қатысы жоқ. Олар индекске қосылған нәрсеге толығымен негізделген. Сіз өзіңіздің жұмыс ағашыңыздағы барлық нәрсені жоя аласыз және әлі ештеңе болған жоқ сияқты git commit .
қосылды автор Mehrdad, көзі
Төменде Чарльз Бэйлидің жауабын қараңыз!
қосылды автор jbenet, көзі
Тек любопыт: неге бөлек беттерді сақтау керек?
қосылды автор CharlesB, көзі
Басқа филиалдан файлдарды тексермей-ақ оқуға болады, сондықтан мен басқа филиалға кассалық шығыссыз жазуға болады деп үміттендім. Мен бұл «табиғи» емес екенін түсіндім, бірақ мен бұл жағдайдағы таза нұсқаны бақылау ретінде емес, GIT-ті деректер қоймасы ретінде пайдаланамын. Менде уақытша шешім бар (жоғарыда айтылған түсініктемеңізді қараңыз), бірақ ол қатал және қателеседі.
қосылды автор Schneems, көзі
pages.github.com - бұл гитара арқылы тікелей пайдаланылатын құжаттама немесе демо бет сияқты html мазмұнына қызмет ету тәсілі. Ол бөлек филиалда болуы керек, себебі ол github оны жазған. Деректер (құжаттарды осы жағдайда) жобамен байланысты болғанымен, негізгі салада міндетті емес болуы керек, себебі кодекске қатысы жоқ шебердің хабарламаларынан олардың біреуі болып табылады.
қосылды автор Schneems, көзі

Бұл гитара міндеттемелерін қайта орындау арқылы жасалуы мүмкін.

This can be done with various call to git hash-object

Бірақ бұл жету қиын.

Толық ақпарат алу үшін, сондай-ақ, қалай модельдеу туралы толық ақпарат алу үшін 9 тарауды оқыңыз . міндеттеме.

11
қосылды

Егер ағымдағы индексіңізде HEAD -дан өзгеше ештеңе жоқ болса, сіз осындай нәрсені сақтай аласыз. (Егер индексіңізді сақтауды қаласаңыз, осы командалардың ұзақтығына уақытша файлға уақытша GIT_INDEX_FILE айнымалы мәнін экспорттай аласыз.)

# Reset index and HEAD to otherbranch
git reset otherbranch

# make commit for otherbranch
git add file-to-commit
git commit "edited file"

# force recreate otherbranch to here
git branch -f otherbranch

# Go back to where we were before
# (two commits ago, the reset and the commit)
git reset [email protected]{2}

Біз ешқашан otherbranch торабын тексерген емеспіз және біздің жұмыс ағаштарымыздың файлдары қозғалды.

8
қосылды

Кейбіреулер айтқандай, бұл мүмкін емес, бірақ іс жүзінде мүмкін емес.

Алайда, Git 2.5 нұсқасында (осы уақыттан бастап 2.6 және одан кейінгі кейбір маңызды түзетулермен) go worktree add дегенді қолданып, - бұл .

Мысалы, мысалы, main және doc «тармақтарында жұмыс істегіңіз келетінін немесе develop және Сынақ «бір мезгілде», бірақ аталған екі тармақта әдейі әр түрлі нәрселер бар. (Мысалы, doc бөлімінің сыртында немесе кодтың жанында болған құжаттары бар немесе test бөлімінде кодқа қарсы орындалатын, бірақ таратылмаған немесе сынақтарды develop жағына немесе кез келгеніне әдейі өткізіп жіберген сәтсіздіктер болуы күтіледі.)

Жай орнына:

git clone -b develop  theclone

содан кейін екі тармақ арасында тұрақты түрде ауысу арқылы theclone жұмыс істейтін болсаңыз, сіз:

git clone -b develop  theclone

бірақ содан кейін:

cd theclone
git worktree add ../ct test  # check out branch test in ../ct

немесе жай ғана:

git worktree add ../test     # check out branch test in ../test

Енді сіз theclone өрісін дамытқан кезде ../ test тестіңізде жұмыс істей аласыз. Өзгерістерді бір тармақтан әдеттегі жолмен біріктіруге және/немесе қайта жүктеуге болады: негізгі репозиторий бұрыннан ортақ пайдаланылады, сондықтан go push немесе get fetch қажет емес. Жоғары деңгейден theclone және test деп аталатын екі бөлек жұмыс ағаштарына тексерілген екеуі де филиалдарыңыз бар.

7
қосылды

Мен келісе алмаймын, бұл мүмкін емес. go stash push , go checkout , go checkout go go және git commit бұл мүмкін.

How I understand problem:

Сіз салалық шебердесіз және сіз patched.txt файлын өзгерту үшін кейбір өзгерістер жасадыңыз және бұл файлды басқа филиалға тапсырғыңыз келеді.

What you would like to do is:

  • save all changes in this repo by doing git stash
  • checkout file.txt from stashed stack
  • add file patched (and only this file) to new branch
  • get back to state of repo before modyfing file.txt

Бұл келесі пәрмендерді орындау арқылы қол жеткізуге болады:

destBranch=patch
thisBranch=master
FileToPutToOtherBranch="file1.txt file2.txt 'file with space in name.txt'"
message="patched files $FileToPutToOtherBranch"
                                                                                  #assumption: we are on master to which modifications to file.txt should not belong
git stash &&\                                                                     #at this point we have clean repository to $thisBranch
git checkout -b $destBranch &&\           
git checkout [email protected]{0} -- $FileToPutToOtherBranch &&                              #if there are many files, repeat this step                                         #create branch if does not exist (param -b)
git add $FileToPutToOtherBranch &&\                                               # at this point this is equal to git add . --update
git commit -m "$message" &&\
git checkout $thisBranch &&\
git stash apply &&\                                                               # or pop if want to loose backup
git checkout $thisBranch -- $FileToPutToOtherBranch                               # get unpatched files from previous branch

The reason why I am using "&&" and the end is if somebody will copy&paste this snippet into terminal, even if one error occurs, next commands will be executed, which is not good. \ is for informing shell that command is continued in next line.

Осы жұмыстарды орындау үшін мен осы үзіндіге тестілеу ортасын беремін

mkdir -p /tmp/gitcommitToAnyBranch && cd /tmp/gitcommitToAnyBranch &&\
git init 
echo 'this is master file' > file1.txt
echo 'this is file we do not want to have modified in patch branch because it does not     patches any feature' > docs.txt
git add file1.txt && git commit -m "initial commit" 
echo 'now this file gets patched' > file1.txt
git status

Енді, сценарийді параметрлермен іске қоссаңыз

destBranch=patch
thisBranch=`git rev-parse --abbrev-ref HEAD`
FileToPutToOtherBranch="file1.txt"
message="patched file $FileToPutToOtherBranch"

You will have file1.txt modified only in patch branch, for more see gitk --all

3
қосылды

Қазіргі уақытта бірде-бір бұйрық жоқ болса, онда кем дегенде тағы екі нұсқасы бар.

  1. Github api-ді міндеттеме жасау үшін қолдануға болады. Бұл хабарлама github repo-де міндеттеме жасайтын мәліметтер.

  2. Github беттерін субмодуль ретінде жасау .

  3. Келісімді жасау үшін сантехникалық командалар сериясын пайдаланыңыз Гип-кітабын жасау үшін пайдаланылатын сантехникалық командалардың сипаттамалары бар . міндеттеме

Ескерту: команда енді mk-tree емес mktree

3
қосылды

Мен дәл осылай жасайтын кішкене құрал жасадым: https://github.com/qwertzguy/git-quick

Сіз басқа филиалдан нақты файлдарды толығымен тексере алмайсыз (тек редакциялауға болатын файлдар) және оларды орындаңыз. Мұның бәрі сіздің жұмысыңыздың көшірмесін немесе үйлену алаңын ешқашан қозғамайды.

Сахналардың артында гитара мен сирек тексеруден тұратын комбинация қолданылады. Көзі өте кішкентай, сондықтан сіз оны оқи аласыз.

1
қосылды

Егер сіз сәтсіздікке жол бермеген нәрселерді жаңылыстырмаған болсаңыз, қарапайым қадамдар:

  1. Осы өзгерістерді сақтаңыз;
  2. оларды оң жақ тармаққа біріктіріңіз;
  3. Бұрынғы филиалыңызды тексеріп, оны бұрынғы әрекетке қайтарыңыз;
  4. Өзгертулеріңізді «git checkout -.» дегенмен тазалаңыз.

Бұдан кейін бәрі жақсы болуы керек. Өзгертулеріңізді таңдап, біріктіріп, қайта салуға және тазалауға болады.

1
қосылды

Міне, мен мұны істеймін:

Егер мен қасақана жасаған болсам, бір міндеттемені орал.

git reset --soft 'HEAD^'

қосқыңыз келетін файлдарды қосыңыз

git add .

жаңа уақытша бөлімшені құрыңыз:

git checkout -b oops-temp

Өзгерістерді орындаңыз:

git commit -m "message about this commit"

тексеру бөлімін тексеріңіз:

git checkout realbranch

ескі филиалды біріктіру:

git merge oops-temp

ескі бөлімшені жойыңыз:

git branch -D oops-temp
0
қосылды