n l i t e d
Dec 22 2017
I have been working on the "Work" branch for a while, finished adding some features, and now I want to see how far it has diverged from the "master" branch.
First I need to make sure everything has been either committed
or thrown away.
git status .
Any files that I want to keep need to be added and committed. Everything else needs to be either deleted, added to .gitignore, or overwritten with the committed version.
git checkout -f -- file.txt
Only after the working directory is clean, I switch to the master branch.
git checkout master
Determine how many files have changed.
git diff --stat Work -- > Files.txt
Files.txt is now my ToDo list, I need to determine how each file changed and decide how to merge it into the master branch. I can do this the slow, methodical way by looking at each file individually or I can do it the fast, error-prone way by letting git do it for me.
Get the text differences between the file in Work and the current
version in master. In this example, DbgOut is the Work branch:
S:\Src\HQ\Dev\SB\Chip\VirtualDisk\CryptDisk\Bin>git diff DbgOut -- CreateZip.bat diff --git a/Bin/CreateZip.bat b/Bin/CreateZip.bat deleted file mode 100644 index 0a41cec..0000000 --- a/Bin/CreateZip.bat +++ /dev/null @@ -1,2 +0,0 @@ -@del CryptDisk.zip -@C:\Bin\7z\7z a -tzip CryptDisk.zip .\Out\%1\CryptDisk.exe .\Out\%1\CryptDriver2.sys .\Out\%1\CryptIFS.sys
In this case, the file exists only in the DbgOut branch. I need to decide whether to pull it into the master branch. If I don't need it, I do nothing. If I do want it, I merge it.
git checkout -p DbgOut -- CreateZip.bat git add CreateZip.bat git commit -m "Merged from DbgOut branch."
I can then view the commit log for the file across all branches.
git log --all CreateZip.bat
To selectively cherry-pick text edits I need to extract the Work
version of the file and use an interactive merge tool (Epsilon, Araxis
Merge, etc) to update the current version.
git show Work:./file.txt > file.txt.work
Use the merge tool to merge changes from file.txt.work into file.txt, then add and commit the merged version.
git add file.txt git commit -m "Merged changed from Work branch."
I can replace the master version of file.txt with the version from
git checkout Work -- file.txt git add file.txt git commit -m "Replaced with the version from the Work branch."
The fast and easy way.
git checkout master git merge Work git push origin master
This works well when the master branch has remained static while Work changed, and git is able to simply "fast-forward" the master branch. But if there are any files that changed in master git will deposit merge markers in the files. I then need to merge these files before I can submit the changes.
Make sure everything has been committed, ignored, or deleted,
git status . On branch master nothing to commit, working tree clean
The updated master branch is pushed to the upstream repo.
git push origin master
I need to decide how to deal with the Work branch. If it is a historical milestone like a product release, I leave it as-is and only use it for reference. If it was an experiment that has run its course, I should delete it.
git branch -d Work
To reuse the branch for further work on the master I need to reset it to mirror the current state of master. The easiest way to do this is by deleting and recreating the branch.
git branch -d Work git checkout -b Work
Or I can keep the branch and overwrite everything with master.
git checkout -f master --