Руководство по Git. Сокрытие изменений.

Предположим, что пытаемся реализовать новую функцию в нашем приложении. Внезапно, нас просят быстро исправить какой-то баг. Для этого мы должны на время прекратить работу над новой функцией. Мы, конечно можем закоммитить часть проделанной работы, но не коммитить часть работы не является хорошей практикой.

Для таких случаев в Git предусмотрена команда stash, которая отслеживает все файлы, которые были изменены и сохраняет их в стек незавершённых изменений, которые могут быть подтверждены в любой момент.

Рассмотрим пример:

Мы работает над классом Developer.java и хотим добавить поле команды, к которой он относится:


package net.proselyte.gittutorial;

/**
 * Simple JavaBean domain object that represents a Technology (Spring, JSF, JPA, etc.)
 *
 * @author Eugene Suleimanov
 * @version 1.0
 */

public class Technology {
    
}

Мы только начали работу над классом и тут нас просят добавить новый класс Technology.java:


package net.proselyte.gittutorial;

/**
 * Simple JavaBean domain object that represents Technology (JSF, JPA, Spring, etc.)
 *
 * @author Eugene Suleimanov
 * @version 1.0
 */

public class Technology {
    private String technologyName;

    public Technology() {
    }

    public Technology(String technologyName) {
        this.technologyName = technologyName;
    }

    public String getTechnologyName() {
        return technologyName;
    }

    public void setTechnologyName(String technologyName) {
        this.technologyName = technologyName;
    }

    @Override
    public String toString() {
        return "Technology: " + this.technologyName;
    }
}

Мы вынуждены отложить работу над классом Developer, но не хотим потерять сделанные изменения.
С этой целью мы используем команду stash:


git stash

Saved working directory and index state WIP on master: f681617 Some style changes.
HEAD is now at f681617 Some style changes.

После добавления нового класса, мы подтверждаем изменения:


git add --all
git commit -m "Adding class Technology"

[master fc5cb38] Adding class Technology
 1 file changed, 2 insertions(+), 4 deletions(-)

Теперь мы хотим вернуться к работе над классом Developer.java. Для этого нам достаточно выполнить следующую команду:


git stash pop 

On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   src/net/proselyte/gittutorial/Developer.java

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (b6d4879ab8f01834abf7514acfcc5bfe4a62b5da)

Проверим статус git:


git status 

On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   src/net/proselyte/gittutorial/Developer.java

no changes added to commit (use "git add" and/or "git commit -a")

После этого, мы заканчиваем работу над нашим класс Developer.java и делаем новый коммит:

Класс Developer.java


package net.proselyte.gittutorial;

/**
 * Simple JavaBean domain object that represents a Developer.
 *
 * @author Eugene Suleimanov
 * @version 1.0
 */

public class Developer {
    private String firstName;
    private String lastName;
    private String specialty;
    private Integer salary;
    private Team team;

    public Developer() {
    }

    public Developer(String firstName, String lastName, String specialty, Integer salary) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.specialty = specialty;
        this.salary = salary;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getSpecialty() {
        return specialty;
    }

    public void setSpecialty(String specialty) {
        this.specialty = specialty;
    }

    public Integer getSalary() {
        return salary;
    }

    public void setSalary(Integer salary) {
        this.salary = salary;
    }

    public Team getTeam() {
        return team;
    }

    public void setTeam(Team team) {
        this.team = team;
    }

    @Override
    public String toString() {
        return "First Name: " + firstName +
                "\nLast Name: " + lastName +
                "\nSpecialty: " + specialty +
                "\nSalary: " + salary +
                "\nTeam: " + team.getTeamName();
    }
}

Подтверждение изменений:


git commit -m "Adding Team property to Developer class"

[master 8d2847d] Adding Team property to Developer class
 2 files changed, 16 insertions(+), 6 deletions(-)

И повторно проверяем статус:


git status 

On branch master
nothing to commit, working directory clean

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