Рубрики
Uncategorized

А второй топ проголосовал вопрос о стойке стека …

Анализируя второй топ проголосованный вопрос. Помечено GIT, VCS, DEVOPS, программированием.

Если вы получите доступ: https://stackoverflow.com/questions?sort=Votes Вы бы увидели лучшие проголосовые вопросы на Stackoverflow.

Не сложно заметить, что 3 из топ-4 голосованных вопросов на Git на Git!

Это может означать одно из двух вещей (или обоих), Git является жестким/нелогичным или GIT является одной из наиболее распространенных используемых технологий. Это сочетание обоих.

Когда вы пытаетесь понять Git, вы заметите, что чтобы получить то, что он хочет из вас (или вы из него), вам нужно понять базовую инфраструктуру. Это в основном потому, что вы должны привыкать к API, который тесно связан с основными строительными блоками. Это то, что делает большую часть путаницы, API (в нашем случае это CLI) — это то, что некоторые говорят, что это утечная абстракция сверху в основном модели.

Достаточно с разглагольником Давайте проанализируем лучший проголосованный вопрос для Git.

Вопрос в том, чтобы Как отменить последний коммит в Git? .

Или на картинке:

Пользователь говорит, что он совершил, но еще не подталкивал.

Как вы думаете, почему это озадается в Git?

  1. Вы можете ожидать API с вернуться/отменить/заказать в другой коммит.
  2. Это предано, ты отменишь новый коммит? Вы можете вернуться вовремя?
  3. Гит говорит, что все хранится навсегда, так как вы действительно отменить?
  4. Исправить недавний коммит (для этого есть команда).
  5. Какая команда вернуться в историю?
  6. Всегда есть это предупреждение о изменении и удалении того, что уже толкнули, мы подвержены риску?

Даже если некоторые из вышеуказанных API существуют, есть слишком много вариантов, которые выбирают, что является вашим лучшим выстрелом?

Давайте рассмотрим первый ответ

Первый ответ предложит ему использовать Git Reset команда. Лучший способ подумать о сбросе Git, как будто вы можете задать указатель головы для перемещения по графу истории Git.

Это было слишком много терминов, голова, сброс, указатель, график

В Git мы совершаем. Каждый коммит добавляет в историю, это коммит вовремя правильно? История может быть описана как график, что означает, что каждый коммит указывает на другой коммит (родительский коммит в случае не слияния Commit), и поэтому у нас есть направленный ациклический график, но другой термин.

Таким образом, ответ попросил пользователя вернуться вовремя, не так ли он хотел? Ответ сказал ему сделать это:

Git сбрасывает голову ~

Мы переехали в прошлое!

Голова указывает на текущее местоположение филиала, ~ указывает на минус один Указатель, родитель текущего фиксации, этот глава указан.

Поэтому, используя команду сброса, мы говорим Git:

Git все, что вы указываете на прямо сейчас (глава), указывают на минус 1 место, предыдущее место в других словах

И Git счастливо делает это для нас.

Обратите внимание, что, поскольку мы не указывали никаких флагов (например, —hard) к командам сброса, он ничего не изменит в нашем рабочем каталоге, поэтому только голова перемещалась туда.

Когда мы хотели отремонтировать что-то в нашем текущем рабочем каталоге, и мы просто переместили голову назад до этого изменения, это означает, что наш текущий каталог теперь зарезан с изменением, которые мы хотели вернуть.

Так что просто вручную вернуть это изменение локально в вашем рабочем каталоге и сделать ** Другой коммит »

Несколько слов о голове

Мы сказали, что голова указывает на последний коммит в текущей зарегистрированной отделении. Как Gitglossary говорит нам:

ГОЛОВА Текущая ветвь. Более подробно: ваше рабочее дерево обычно происходит из состояния дерева, называемого головой. Голова представляет собой ссылку на одну из головок в вашем репозитории, за исключением случаев использования отдельной головы, в этом случае он напрямую ссылается на произвольный коммит.

Я вижу, я вижу, поэтому голова обычно указывает на нынешнюю ветку, кроме как нет! и когда не указывает непосредственно на совершение

Но каково было бы родителем этого фиксатора?

Как мы переехали наши Голова Один из них посвящен прошлому, это означает, что любой другой коммит, который был будущим в будущем этого прошлой точки, больше не указан на график — предполагая, что мы заставляем новых коммитов этой главы ~ родительский коммит. Это означает, что мы не добавляем только к истории Git, мы меняем историю, принимая родителей (в нашем случае главы ~ и с новым коммитаром мы даем это другому ребенку, чем было). Например, если мы переместим один коммит в прошлое с головой ~ и начать коммит оттуда коммитарию от первоначальной головки (который был ребенком головы ~) больше не будет существовать в стандартной истории журнала. Итак, если бы у кого-то еще был этот ребенок-головой, совершил и использовал его для создания новых коммитов (новые дети для этой головы, глава + 1, вы могли бы назвать его), это создало бы проблемы (курс, предполагая, что мы делимся нашей историей переписать с ним).

Поэтому после того, как мы сделаем Git Reset и вернитесь один коммит в нашем местном репо, мы обычно делаем локальные исправления в нашем рабочем каталоге, а затем мы совершаем. Этот коммит — это новый коммит, но у него есть тот же роль, что и коммит, который мы исправляем, поэтому дети, возможно, отличаются для нас и для других, у которых уже есть этот же снимок хранилища до нашего изменения.

Итак, если бы другие пользователи уже могут совершать старые фиксаторы наших людей, которые мы просто «отсоединены» из репо, и мы заставляем его в удаленное репо, это заставило бы их получить «Восстановление из восстанавливаемого монтажа» и других неприятных вещей.

Мы можем протолкнуть это к главному хранилищу, но будьте осторожны с этим, потому что это будет испортить вещи для других парней, что бы произошло, когда они пытаются потянуть его и обнаружить, что их родитель отличается от вашего?

И ответ заканчивается с «вы могли бы только сделать Git Compare --Amend — аминь Но это еще один ответ, что мы расследовались в другом посте.

Не все потеряно

Одна последняя заметка, если вы хотите вернуть сброс Git, вы можете использовать Refrog какие магазины как журнал всего, что вы делаете, и просто как Git Reset, вы можете использовать Refrog чтобы вернуться назад свое возвращение во времени. Это может быть достигнуто с:

Git Reset ‘Head @ {1}’

Который говорит Git, эй Git помните, что я хотел сброс, ну теперь я хочу, чтобы вы сбросили на один предыдущий момент времени, прежде чем я сделали сброс.

Резюме

Мы научились вернуться вовремя с Git Reset. Видимо это Во-вторых, самый проголосованный вопрос в стойке.

Приложение A — Некоторые практики

Хотите «доказать» некоторые из вышеуказанных утверждений? Ведь мы говорили много вещей о главе, филиале, совершают, посмотрим. У нас есть локальный репозиторий Git, давайте распечатаем голову, это просто сидит там, ждет вас, чтобы распечатать его.

Step 1: Let's see what is HEAD, let's print the HEAD file

$ cat .git/HEAD # => HEAD is a file in .git directory - yeah on the base dir, let's print it.
ref: refs/heads/master # => So head is simply this line of text, this looks like a branch, let's print it.

# Step 2: HEAD --> master => OK so let's see what is master file

$ cat .git/refs/heads/master  # => Now we are printing what head points to, it should be the commit of the branch..
a15d580cc90d47a88f7f971914d45ff5a0e30eef # => So this is the commit which master points to.  But how do we know this number is a commit?

# Step 3 : Print the commit content, after all it was pointed indirectly by HEAD
$ git cat-file -t a15d580cc90d47a88f7f971914d45ff5a0e30eef
commit # => Yes git is saying this SHA-1 is a commit.  Was not persuaded yet? How about this:
$ git cat-file -p a15d580cc90d47a88f7f971914d45ff5a0e30eef
tree 7d80e5c527e9a1ec7f79f68386ce9710f1e048ce # It makes shadow like a commit.
parent ddf47ffcb19e2aee4839cae40e79fd7579fc637f # It has parents like a commit.
author Tom  1537007909 +0300 # It has an author like a commit
committer Tom  1537007909 +0300 # It has a committer.. like a commit

my commit message # => It talks like a commit.

# So its a commit! :)

# Step 4 : Did HEAD point to the tip of branch?
$ git log --oneline # => is the commit a15d580... really the head?
* a15d580 - (HEAD -> master) test (2 days ago) # => Yes a15d580 is indeed our latest commit where head points to!
* ddf47ff - (develop) added file to folder (9 days ago)
* 9d0e101 - hi (10 days ago)

В основном картина так:

То, что мы видим в приведенной выше картинке, — это команды Bash выше, мы видим, что:

  1. Головки указывают на текущий филиал.
  2. Наша нынешняя филиал указывает на совершение в нашем ветке в нашем случае, это последний.
  3. Коммит указывает на дерево.
  4. Дерево указывает на список капель и деревьев (и деревьев в свою очередь, указывает на список деревьев и капель, дерево — это каталог).

И, таким образом, когда мы просим Git перейти к предыдущему фиксации с Git сброс --soft Head ~ Мы попросили Git, что наша нынешняя ветвь, которая указана головой, должна указывать на один предыдущий коммит, который все это.

Давайте сделаем сброс на один предыдущий коммит

# Step 5 : Do the reset and see it's effect
$ git reset --soft HEAD~ # Git please move HEAD to point to one previous commit.

# Step 6: Now what is the reset effect on HEAD
$ cat .git/HEAD
ref: refs/heads/master # => Didn't move! it points to the same place to the master.
$ cat refs/heads/master
ddf47ff (HEAD -> master, develop) added file to folder # => Aha so master branch pointer did move and HEAD simply points to our branch as the diagram shows.
9d0e101 hi

Резюме

С приложением A мы видели, что мы можем выкопать в Git и посмотреть, какую головку и не только по определению, какая ветка, эффект сброса Git. Это одна вещь, чтобы прочитать документы И на самом деле это настоящее благословение, которое мы действительно можем увидеть его на каталоге .git, в противном случае нам просто нужно было бы доверять документам, и это было бы действительно так сказать, не так полезно.

Оригинал: «https://dev.to/tomerbendavid/the-second-most-voted-question-on-stackoverflow-is-60b»