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