Как сделать hard reset на предыдущий коммит в libgit2? - PullRequest
4 голосов
/ 02 марта 2020

Моя программа (которая использует libgit2) делает коммит в локальное репо (без pu sh, только коммит), затем делает что-то и затем, в соответствии с результатом, пытается отменить последний коммит сбросив репо в HEAD ~ 1 (один коммит до HEAD). Просто hard reset.

Проблема : приведенный ниже код сбрасывает HEAD в HEAD ~ 1, но оставляет все изменения между этими 2 коммитами как «поэтапные», а мне нужно просто стереть их меняется. Что я делаю не так?

bool RevertLastCommit(std::string &errorMessage) {
    int error;
    git_object *head_commit_obj = nullptr;
    error = git_revparse_single(&head_commit_obj, repo, "HEAD~1");

    if (error < 0)
    {
        return false;
    }

    git_commit *head_commit = (git_commit *)head_commit_obj;

    git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
    opts.checkout_strategy = GIT_CHECKOUT_FORCE;

    int reset_result = git_reset(repo, const_cast<git_object *>(head_commit_obj), GIT_RESET_HARD, &opts);

    if (reset_result < 0) {
        printf("Reset failed!\n");
        return false;
    }

    printf("Done reverting\n");

    error = git_checkout_head(repo, &opts);
    if (error < 0)
    {
        return false;
    }

    printf("Hard checkout\n");
    return true;

...