Как получить последние детали файлов фиксации после принудительной проверки [duplicate]

опустил ли я O, 0, i?

Просто создал php-класс, основанный на решении Райана.

<?php

    $shorty = new App_Shorty();

    echo 'ID: ' . 1000;
    echo '<br/> Short link: ' . $shorty->encode(1000);
    echo '<br/> Decoded Short Link: ' . $shorty->decode($shorty->encode(1000));


    /**
     * A nice shorting class based on Ryan Charmley's suggestion see the link on stackoverflow below.
     * @author Svetoslav Marinov (Slavi) | http://WebWeb.ca
     * @see http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener/10386945#10386945
     */
    class App_Shorty {
        /**
         * Explicitely omitted: i, o, 1, 0 because they are confusing. Also use only lowercase ... as
         * dictating this over the phone might be tough.
         * @var string
         */
        private $dictionary = "abcdfghjklmnpqrstvwxyz23456789";
        private $dictionary_array = array();

        public function __construct() {
            $this->dictionary_array = str_split($this->dictionary);
        }

        /**
         * Gets ID and converts it into a string.
         * @param int $id
         */
        public function encode($id) {
            $str_id = '';
            $base = count($this->dictionary_array);

            while ($id > 0) {
                $rem = $id % $base;
                $id = ($id - $rem) / $base;
                $str_id .= $this->dictionary_array[$rem];
            }

            return $str_id;
        }

        /**
         * Converts /abc into an integer ID 
         * @param string
         * @return int $id
         */
        public function decode($str_id) {
            $id = 0;
            $id_ar = str_split($str_id);
            $base = count($this->dictionary_array);

            for ($i = count($id_ar); $i > 0; $i--) {
                $id += array_search($id_ar[$i - 1], $this->dictionary_array) * pow($base, $i - 1);
            }

            return $id;
        }
    }

?>
83
задан CodeWizard 9 June 2016 в 07:58
поделиться

4 ответа

Перед ответом добавьте некоторый фон, объяснив, что это HEAD.

First of all what is HEAD?

HEAD - просто ссылка на текущая фиксация (последняя) в текущей ветке. В любой момент времени может быть только один HEAD. (исключая git worktree)

Содержимое HEAD сохраняется внутри .git/HEAD и содержит 40 байтов SHA-1 текущего фиксации.


detached HEAD

Если вы не используете последнюю фиксацию - это означает, что HEAD указывает на предыдущую фиксацию в истории, ее назвали detached HEAD .

В командной строке это будет выглядеть так: SHA-1 вместо имени ветки, так как HEAD не указывает на кончик текущей ветви


Несколько вариантов восстановления после отсоединенного HEAD:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Это проверит новую ветвь, указывающую на требуемую фиксацию. Эта команда будет проверять заданную фиксацию. На этом этапе вы можете создать ветвь и начать работать с этой точки.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Вы всегда можете используйте reflog. git reflog отобразит любое изменение, которое обновило HEAD и проверив нужную запись reflog, установит HEAD обратно на эту фиксацию.

Каждый раз, когда HEAD изменяется, в reflog

git reflog
git checkout HEAD@{...}

появится новая запись. Это вернет вас к вашему желаемому фиксации


git reset --hard <commit_id>

«Переместить» HEAD обратно в нужное commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Примечание: ( С Git 2.7 ) вы также можете использовать git rebase --no-autostash.


git revert <sha-1>

«Отменить» заданный диапазон фиксации или фиксации. Команда reset «отменяет» любые изменения, сделанные в данной фиксации. Новая фиксация с патчем undo будет совершена, в то время как исходная фиксация останется в истории.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Эта схема иллюстрирует, какая команда выполняет что. Как вы можете видеть там reset && checkout, измените HEAD.

197
ответ дан DaveyDaveDave 18 August 2018 в 01:51
поделиться
  • 1
    Если вы не используете последнюю фиксацию - это означает, что HEAD указывает на предыдущую фиксацию в истории, ее вызываемую независимую HEAD , если только предыдущая фиксация в истории не является концом другой ветви. По моему опыту, вы можете сказать, что вы отсоединены, если HEAD не указывает на фиксацию, на которую также указывает любая ветка. Это не относится к тегам. – Tim Castelijns 19 April 2016 в 10:25
  • 2
    Вы можете находиться в отдельной головке и в то же время иметь ветвь с тем же фиксацией, что и HEAD этой ветки. Я не понимаю ваш комментарий – CodeWizard 19 April 2016 в 10:29
  • 3
    У меня есть проблемы с использованием разметки встроенного кода для заголовков :) – jubobs 22 December 2016 в 18:07
  • 4
    Не удалось найти лучшего способа подчеркнуть это. не стесняйтесь редактировать. вы более чем рады – CodeWizard 22 December 2016 в 19:04

Вопрос может быть прочитан как:

Я был в состоянии отсоединения с HEAD в 23b6772 и набрал git reset origin/master (потому что я хотел раздавить). Теперь я передумал, как вернуться к HEAD в 23b6772?

Прямой ответ: git reset 23b6772

Но я столкнулся с этим вопросом, потому что мне стало тяжело печатать (скопировать и вставлять) хеши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий HEAD, и был Googling, чтобы увидеть, есть ли какая-либо стенография.

Оказывается, есть!

git reset - (или в моем случае git cherry-pick -)

Что, кстати, было таким же, как cd -, чтобы вернуться к предыдущему текущий каталог в * nix! Так ура, изучил две вещи одним камнем.

2
ответ дан antak 18 August 2018 в 01:51
поделиться

Вот такой подход, который может быть очень простым и запоминающимся. Проверьте 2 условия и выполните команду 1.

Если

вы находитесь в «отдельной голове» (т. Е. Введите git status, вы увидите HEAD detached at <commit_id>)

И

существующая ветка соответствует вашим потребностям (т. Е. Введите git branch -v, вы увидите название ветки с соответствующими сообщениями фиксации, представляющими работу, которую вы хотите продолжить)

Затем

просто проверьте эту ветвь (т. е. тип git checkout <branch_name>, вы увидите Switched to branch <branch_name>).

Исходные данные

Теперь вы можете продолжать добавлять и выполнять свою работу, как и раньше; изменения будут отслеживаться на <branch_name>.

Обратите внимание, что если вы сохранили работу во время отсоединения HEAD, в большинстве случаев эта работа будет автоматически объединена в описанном выше процессе. Если вы видите сообщение о конфликте слиянием, не паникуйте. Существует несколько замечательных руководств с простыми шагами для устранения конфликта и завершения слияния.

7
ответ дан Kay V 18 August 2018 в 01:51
поделиться
0
ответ дан amuliar 29 October 2018 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: