I need to config the environment to tell the Git where to commit or push the data.
$ git config --global user.name ZhongJunhong
$ git config --global user.email [My GitHub login in email]
The global configuration can be changed in the future in such hidden document: ~/.gitconfig
:
$ cd # change to user home dir
~$ vim .gitconfig
Create a folder and change dir to it.
$ mkdir learngit
$ cd learngit
Initialize such dir as Git repo.
$ git init
This operation will add a hidden file named ".git" to local dir.
$ ls -a
. .. .git learngit.md
To understand git add
and git commit
command, it' s necessary to specify the Git workflow:
Initialize the Git repo, such repo (the work folder actually) is called master
branch in Git.
When we change something in repo, the change will not be added to master
directly, they should be moved to a place that we called stage
in Git for temporary.
Add a changed file to stage
.
$ git add [filename]
Or add all changed files to stage
.
$ git add .
Step3: All change added to stage
need to be moved to master
branch.
$ git commit -m "first commit"
Commit comment could not be skip. It 's necessary to specify what have been changed in every commit time.
Every commit is to specify a version of such repo. It 's the key for Git to achieve version control.
And we will see the respon from Git:
1 file changed, 2 insertions(+), 1 deletion(-)
To check Git status by command:
Respond showed below mean something has been changed but not commit.
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: learngit.md
no changes added to commit (use "git add" and/or "git commit -a")
After git add
:
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: learngit.md
After git commit
:
$ git commit -m "test"
[master 78da7cf] test
1 file changed, 9 insertions(+)
$ git status
On branch master
nothing to commit, working tree clean
Create local personal public and privace ssh key.
$ cd # Change to user home dir.
~$ ssh-keygen -t rsa -C [GitHub login email address] # Generate personal public ssh key and private ssh key.
$ cd .ssh
$ ls
id_rsa id_rsa.pub # id_rsa stored the private ssh key that can not be share. The other is the public ssh key.
$ vim id_rsa.pub # open the public ssh key, and copy all content in it.
Add ssh key to GitHub account. Just turn on the personal account setting, and direct to ssh setting, create a new ssh key and name it what you like. Here 's no detail cause I need to protect my privacy.
ssh key is used for GitHub to identify the permission of who commits to the repo.
More detail about differencies between privace and public ssh key please search on Google, this is really a good way instead of identification by username and password.
Create a GitHub repo. Here I create a repo named learngit for example.
I have told that the local repo called master
in Git above, and the GitHub remote repo we create here called origin
in Git, but it named master
still on GitHub you can see.
Set up the remote origin
for the local repo.
$ git remote add origin git@github.com:ZhongJunhong/learngit.git
Connect to GitHub repo and push.
$ git push -u origin master
Enumerating objects: 57, done.
Counting objects: 100% (57/57), done.
Delta compression using up to 4 threads
Compressing objects: 100% (38/38), done.
Writing objects: 100% (57/57), 5.85 KiB | 498.00 KiB/s, done.
Total 57 (delta 18), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (18/18), done.
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote: https://github.com/ZhongJunhong/learngit/pull/new/master
remote:
To github.com:ZhongJunhong/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
In the first time pushing to remote repo, I specify parameter -u
to set the connection between remote origin
branch and local master
branch.
And the parameter -u
can be skipped in the future like:
$ git push origin master
Or just:
$ git push
$ git pull
It 's necessary to enter the correct command expecially the username when we connect to GitHub repo cause when the origin
be set up once it can not be changed later until remove it.
Remove the origin of the local repo.
$ git remote remove origin
Then repeat the operation above.
From several years ago, GitHub began to use the main
for default branch name instead of master
that used before.
For now we can easily move content from a branch to another. Here I assume that you have set up master
branch locally and remotly.
Before beginning, it 's necessary to explain what is branch
in Git:
A branch
is likely a "sandbox" workspace in a project. Whatever you have done inside a branch, there would be nothing can affect other branch until someone have permission merge two branchs.
$ git config --global init.defaultBranch main
First, build a branch named main
locally.
$ git checkout -b main
We can check all branch and the current branch locally.
The star * ahead of one of the branch name means the current branch.
$ git branch
master
* main
Merge the local master
branch to local main
branch. Do remember to add
and commit
in master
branch before merging.
$ git merge master
Updating 50323a6..92033e8
Fast-forward
learngit.md => README.md | 50 +++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 45 insertions(+), 5 deletions(-)
And then do remember to add
and commit
in main
branch.
$ git add .
$ git commit -m "merge from master branch"
Then push it to remote branch.
$ git push -u origin main # for initialized time, can be skipped in the future.
The local and remote master
branch can be deleted now. But you 'd better check the pushing are successful on GitHub before your deleting.
Delete the local master
branch.
$ git branch -D master
Delete the remote master
branch.
$ git push origin -D master # D means force deleting
And I have meet some error before:
int: Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again.
See the 'Note about fast-forwards' in 'git push --help' for details.
Such error occured cause I have made some change on remote branch by GitHub web interface that have not merge locally. And I finally rebase
the branch between remote and local branch to fix it.
$ git pull --rebase origin main