Git Fundamentals
How to get updates from main repo without losing your commits
GitHub Copilot: If you want to get the latest commit from the original repository while keeping your changes, you can use git pull
with the --rebase
option. Here are the steps:
- First, make sure you are on the branch where you want to apply the updates:
git checkout <your_branch>
git fetch upstream
git rebase upstream/master
git diff origin/<your_branch>
# resolve conflict
git add <file_with_resolved_conflict
git rebase --continue
git push origin <your_branch> --force
How to keep README, LICENSE
[!INFO] files from deleted when merging new branch to main.
-
First, switch to the branch that you want to merge into
main
:git checkout <branch-name>
-
Then, use the
checkout
command to get theREADME
andLICENSE
files frommain
:- This add README and LICENSE files to your bare-repo that you want to merge into main.
git checkout main -- README LICENSE
-
If there are any conflicts, resolve them. Then, commit the changes:
git commit -am 'Merged branch and kept README and LICENSE files'
-
Finally, switch back to the
main
branch and merge the other branch:bash git checkout main git merge <branch-name>
This way, theREADME
andLICENSE
files frommain
will be kept even after merging the other branch Source 0, Source 1, Source 3. Another way to handle this situation is to use Git attributes. You can define a merge driver that always favors the current version of a file, and then use this driver for the files that you want to preserve. Here's how you can do it: -
Define a merge driver that always favors the current version of a file:
git git-bare --global merge.ours.driver true
-
Add a
.gitattributes
file that tells Git to use theours
driver for theREADME
andLICENSE
files:bash echo 'README merge=ours' >> .gitattributes echo 'LICENSE merge=ours' >> .gitattributes git add .gitattributes git commit -m 'chore: Preserve README and LICENSE files during merges'
This will tell Git to use theours
driver (which always favors the current version of a file) when merging theREADME
andLICENSE
files Source 2.
How to clone specific branch?
git clone -b bare-repo <url>
How to update(commit, push, merge) github projects?
# Update dev or enhancement branch
git status #to see modifications
git commit -am 'updated <file_name>'
git push origin <branch_name>(e.g enhancement or dev)
# Merge changes to main
git checkout main
git merge enhancement
git push origin main
Revert last commit
git revert HEAD
git revert --no-commit da65336 ─╯
~/Documents/repository/super-productivity on master revert +1
git commit
How to sync fork via upstream for new commits?
Source: github
git checkout master
# Get commits
git fetch upstream
# Rebase local branch to insert last commits from fetched upstream
git rebase upstream/master
# Push to your fork
git push origin master
How solve 2 commit behind or sync to branch with main after main get updated from PR?
git checkout main
git fetch origin main
git checkout feat/extract
git rebase origin/main
How to squash N commits to 1 commit?
[!INFO] More Resource: https://www.freecodecamp.org/news/git-squash-commits/
# Commits = 26
git rebase -i HEAD~26
- After that select the commit you want to make first commit with
pick
, make otherssquash
ors
- If you want to make 2 commit from 26 commit use
b
calledbreak
between 2 commit. After first commit done with rebase,git rebase --continue
to handle second commit.
pick adaafa495 fix: settings section
s 49b1b4caa fix: delete unused string
s 8a34a3df0 fix: update changed GITHUB FORM string
s 7ba585e69 fix: delete unused strings
s 11de85c4c fix: delete unused CALDAV strings
s 360011b11 fix: delete unused GITEA strings
s d64180711 fix: delete unused unknown FORM string
s d666891cb fix: delete unused redmine section strings
s 063898871 fix: delete unused OpenProject strings
s 69e698c38 fix: delete unused string
s 6c9ccc810 fix!: delete unused PP strings
b
pick ee3562b7d feat!: add missing CALENDAR strings
s 6104a1446 feat: add missing DROPBOX string
s ca7172528 feat: add missing GITHUB error string
s 230bfbcec feat: add missing ISSUE strings
s 6dfa77741 feat: add missing notes section strings
s 800edab2f feat!: add PLANNER strings
s c164ace47 feat: add PROCRASTINATION strings
s 06c321b42 feat: add stopwatch strings
s 3ba1657f6 feat!: add SYNC string
s 6b43158e9 feat: add missing strings
s 07990c502 feat!: add CALENDARS string
s 071689691 feat: add missing strings
s e227c7580 fix: translate openproject strings
s fb01adc04 fix: add missing strings
s 92ed01bad fix: add missing REMINDER strings
- update commit message for first commit e.g
fix!: delete unused strings
git rebase --continue
- update commit message e.g
feat!: add missing strings
git push origin turkish --force
How to sync and solve commit behind
[!INFO] how to fix 3 commit behind, 9 commit ahead. How to PR your commits to repo when your branch behind from some commits without losing your commits?
- Fetch updates to local from upstream, push updates to origin forked master branch, Rebase master to branch you want to add new updates from master and push force your branch
# sync upstream master and push new commits to your fork
git checkout master
git fetch upstream
git rebase upstream/master
git push origin master
# get latest updates from master and add your branch
git rebase master
git push origin turkish-update --force
How to revert back without commit?
[!INFO] Bununla commit hiç bir şekilde görünmez ve eklenen commit tamamen yok olur. Dikkatli ol. How to undo commits, revert back without commit to github like delete commit?
# son commit resetle
git reset --hard HEAD~1
# OUTPUT: HEAD is now at b8492fdd3 Fix SCHEDULE string and add new strings
# push to your branch with force to not deal with conflict errors
git push origin turkish-fix --force
How to solve 169 commit ahead from upstream?
- This error going to show something like this
~/Doc/r/super-productivity on @59f0afad rebase-i 6/164 ~1
. This is represent 164 commit conflict and git want it user to solve it. - Abort this if your commit not necessary
git rebase --abort
and reset git and push changes to your forked master branch via force.
git reset --hard upstream/master
# Then it's going to show 169 commits is going to unstaged or revert via arrow down:
#─ ~/Doc/r/super-productivity on master ⇣169
# After that force changes to fork.
git push origin master --force
- Change the current working directory to your local project.
- Fetch the branches and their respective commits from the upstream repository. Commits to
BRANCHNAME
will be stored in the local branchupstream/BRANCHNAME
.$ git fetch upstream
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
> * [new branch] main -> upstream/main - Check out your fork's local default branch - in this case, we use
main
. It can bemaster
too$ git checkout main
> Switched to branch 'main' - Merge the changes from the upstream default branch - in this case,
upstream/main
- into your local default branch. This brings your fork's default branch into sync with the upstream repository, without losing your local changes.If your local branch didn't have any unique commits, Git will perform a fast-forward. For more information, see Basic Branching and Merging in the Git documentation.$ git merge upstream/main
> Updating a422352..5fdff0f
> Fast-forward
> README | 9 -------
> README.md | 7 ++++++
> 2 files changed, 7 insertions(+), 9 deletions(-)
> delete mode 100644 README
> create mode 100644 README.mdIf your local branch had unique commits, you may need to resolve conflicts. For more information, see "Addressing merge conflicts."$ git merge upstream/main
> Updating 34e91da..16c56ad
> Fast-forward
> README.md | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-) - Also if master has commit, you need to push to changes to your fork master
git push origin master