push pull dance! Pushing by default Pushing to a remote by default pushes to a branch with the same name for example if you are in branch dev $ git checkout -b dev Switched to a new branch 'dev' And you have these remotes $ git remotecodebaseorigin To see which remotes these are to you can add -v flag referring Doing a push here will push to the remote with the same branch name $ git push codebaseTotal 0 (delta 0), reused 0 (delta 0)remote:remote: To create a merge request for dev, visit:remote: https://codebase.your-gitlab.com/infra/cmp_configs_clone/merge_requests/new?merge_request%5Bsource_branch%5D=devremote:To https://codebase.your-gitlab.com/infra/cmp_configs_clone.git * [new branch] dev -> dev As you see it pushes to a branch named as well on the remote side. If the branch does not exists on the remote side it will be created. dev automatically If you are in branch locally and you try to push to another branch let's say you will get this message without actual push dev master $ git branch* dev master customer1/add-ext-js-packages customer1/batch_somefunc customer1/desktop-upgrade customer1/shrink-somefunc/req/PROJECT-726 customer1/upgrade-and-add-elastic-desktop customer2/local-auth customer3/somelib-pipeline-fix$ git push codebase masterEverything up-to-date Setting up upstream When you push you have the option to setup your upstream. Upstream in this context means your default remote tracking. The syntax: git push -u <remote> <branch> Usually you want your branch name on local to be the same branch name on master For example: git push -u origin feat/new-feature-toggle Once you setup your upstream you only need to do git push And it will automatically know which remote branch it refers to. Upstreams are done per branch. To be able to check which upstream you are currently referring to run: git branch -avv Notice the two -v flag single -v will only give you the commit messages not including the upstream branch. Pushing to a different branch If you want to push to the same remote but a different branch. Use the following syntax; git push <branch with new changes>:<branch you are pushing to> For example: git push origin dev:master This pushses local branch to origin branch dev master Pulling from a different branch This is using the same syntax for pushing git pull origin master:dev This updates your local branch using the remote origin branch dev master Push to a local branch Check the branches both remote and local $ git branch -av* master customer1/add-ext-js-packages customer1/batch_somefunc customer1/desktop-upgrade customer1/shrink-somefunc/req/PROJECT-726 Push changes from master to -> customer1/add-ext-js-packages $ git push --force . master:customer1/add-ext-js-packagesTotal 0 (delta 0), reused 0 (delta 0)To . + 3e205c3...31f2769 master -> customer1/add-ext-js-packages (forced update) Notice the where a remote should be. also branch to branch pushing is . branch1:branch2 The syntax is : git push . <branch with new changes>:<branch you are pushing to> Similarly it is possible to pull from a local branch to another local branch The syntax is git checkout <branch you want updated>git pull . <branch you want the updates> Delete a remote branch by pushing There is a lesser known fact that you can delete remote branches by pushing into them. The syntax to delete these branches is. git push origin :<branch> For examples: $ git branch -av* dev master customer1/add-ext-js-packages customer1/batch_somefunc customer1/desktop-upgrade customer1/shrink-somefunc/req/PROJECT-726 $ git push codebase :devUsername for 'https://codebase.your-gitlab.com': kenichi.shibataPassword for 'https://kenichi.shibata@codebase.your-gitlab.com':To https://codebase.your-gitlab.com/infra/cmp_configs_clone.git - [deleted] dev $ git branch -av* dev master customer1/add-ext-js-packages customer1/batch_somefunc customer1/desktop-upgrade customer1/shrink-somefunc/req/PROJECT-726 As you can see it deleted the branch on the remote side. dev You can also push multiple at once $ git push codebase :customer1/add-ext-js-packages :customer1/batch_somefunc :customer1/shrink-somefunc/req/PROJECT-726Counting objects: 14, done.Delta compression using up to 56 threads.Compressing objects: 100% (11/11), done.Writing objects: 100% (14/14), 1.15 KiB | 0 bytes/s, done.Total 14 (delta 8), reused 3 (delta 1)remote:remote: To create a merge request for customer1/upgrade-and-add-elastic-desktop, visit:remote: https://codebase.your-gitlab.com/infra/cmp_configs_clone/merge_requests/new? merge_request%5Bsource_branch%5D=customer1%2Fupgrade-and-add-elastic-desktopremote:To https://codebase.your-gitlab.com/infra/cmp_configs_clone.git - [deleted] customer1/add-ext-js-packages - [deleted] customer1/batch_somefunc - [deleted] customer1/shrink-somefunc/req/PROJECT-726 For other developers tracking this remote you have to ask them to or then do on your local machine to delete the local branch pull fetch --prune branch -d Pushing a local COPY (not remote) of the repo First create a local dir and do git init $ mkdir test$ cd test$ ls$ git initInitialised empty Git repository in /home/shibata100012/company_workspace/cmp_core/cmp/test/.git/ Then go back to you repo and add the test directory as your remote (local) $ git remote add local ../test$ git remote -vcodebase https://codebase.your-gitlab.com/infra/cmp_configs_clone.git (fetch)codebase https://codebase.your-gitlab.com/infra/cmp_configs_clone.git (push)local ../test (fetch)local ../test (push)origin git@git.wsq.io:cmp_core/cmp_configs (fetch)origin git@git.wsq.io:cmp_core/cmp_configs (push) Finally do a push to that remote (local) $ git push localCounting objects: 14191, done.Delta compression using up to 56 threads.Compressing objects: 100% (5100/5100), done.Writing objects: 100% (14191/14191), 1.41 MiB | 0 bytes/s, done.Total 14191 (delta 6243), reused 14007 (delta 6097)To ../test * [new branch] dev -> dev Pulling without merge commits Most of the time when we do if we have a the remote has a commit that we do not have locally git defaults to creating . Merge commits are commits which are seemingly empty and that they only adds the commit however in reality if you look closer and add flag while logging you can actually see that these commits do more sometimes. It can cause confusion if you are trying to track down a change that is in merge commit especially if you are merging commits manually. git pull merge commits -m My recommendation is to do away with merge commits and use rebase instead of merge. Most developers uses this approach when rebasing a local clone against a remote. $ git fetch <remotename>$ git rebase <localbranch> <remotename>/<branch> Most of the time it works well. However if you are writing tons of commits and have little patience fetching and rebasing manually you can do: $ git pull --rebase This will automatically do fetch and rebase instead of the default pull behaviour fetch and merge. Then you can resolve the conflicts if there is any. Or if you are like me and you like shortcuts you can add it to your aliases git [alias]pullr = pull --rebase Now you only have to do git pullr If you are looking for more convenient git aliases https://kenichishibata.net/my-gitconfig-with-all-the-bells-and-whistles-9479530f12af