Git
- 1、本地操作
- 2、版本管理
- 3、远端仓库
- 4、分支管理
- 5、缓存stash
- 6、遗留rebase
- 7、标签管理
- 8、解决冲突
- 9、参考教程
- 10、示例代码
1、本地操作
- Linux安装git:yum install git
- 查看git版本 git version
- 查看git设置 git config --list
- 设置git属性 git config --global
- 初始化git仓库:git init
- 初始化git用户邮箱:git config --global user.email “rice_van@email.com”
- 初始化git用户姓名:git config --global user.name “rice_van”
- 添加到仓库:git add filename.txt
- 提交到仓库:git commit -m “change messages”
- 查看仓库状态:git status
- 查看工作区修改区别:git diff
- 查看工作区文件区别:git diff HEAD – filename.txt
- 查看版本记录:git log
- 查看简洁记录:git log --pretty=oneline
- 查看命令记录:git reflog
2、版本管理
版本库提交流程:
- 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
- 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
- 每次修改,如果不用git add到暂存区,那就不会加入到commit中
- 第一次修改 -> git add -> 第二次修改 -> git add -> git commit
- HEAD表示当前版本
- HEAD^表示上一版本,上上版本HEAD^^
- 前100次版本HEAD~100
- 回退最新提交:git reset --hard HEAD^ (即回到此版本的前一版本)
- 回到指定版本:git reset --hard commit_id
- 撤销暂存区修改,修改内容放回到工作区:git rest HEAD filename.txt
- 撤销工作区修改:git checkout -- filename.txt
- 回退本地误删文件:git checkout --filename.txt
- 删除仓库文件:
git rm filename.txt
git commit -m “remove filename.txt”
3、远端仓库
- 生成ssh秘钥:ssh-keygen -t rsa -C “xxxxxx@email.com”
- 克隆远端仓库到本地:git clone git@github.com:xxxxx/learngit.git
- 本地关联远程仓库:git remote add origin git@gitee.com:xxxxx/learngit.git
- 查看远端仓库:git remote
- 查看远程仓库信息:git remote -v
- 删除远端关联关系:git remote rm origin
- 本地修改推送远程仓库:git push origin master
- 本地修改推送远程仓库:git push -u origin master
- 推送到远端指定分支:git push origin originbranchname
- 抓取远程分支到本地:git checkout -b branchname origin/branchname
- 设置本地分支对应到远端指定分支:git branch --set-upstream-to=origin/branchname branchname
- 本地分支与远端分支名不同时:git push origin HEAD:branchname (远端名)
尽量保持本地分支名与远端分支名一致
4、分支管理
- 查看所有分支:git branch
- 创建分支:git branch branchname
- 删除分支:git branch -d branchname
- 强行删除为合并分支:git branch -D branchname
- 切换分支:git swtich branchname
- 创建并切换分支:git swtich -c branchname
- 合并到指定分支到当前分支:git merge branchname
- 禁用Fast Forward方式合并:git merge --no-ff -m “messages” branchname (删除分支后可看合并历史)
- 查看分支合并图:git log --graph
- 查看分支合并图简易:git log --graph --pretty=oneline --abbrev-commit
- 复制commit到当前分支:git cherry-pick commitid
5、缓存stash
- 缓存修改:git stash
- 缓存并标记:git stash -m “issue-01-2023.03.20:57”
- 缓存列表:git stash list
- 应用缓存:git stash apply
- 删除缓存:git stash drop
- 应用并删除:git stash pop
- 应用某一缓存:git stash apply stash@{4}
6、遗留rebase
7、标签管理
- 标签作用:标记commit,快速查看重要提交节点
- 添加标签默认添加到当前分支的最新commit:git tag v1.0
- 添加标签到指定commit:git tag v2.0 commitid
- 添加标签与说明信息:git tag -a v3.0 -m “version 3.0 released”
- 查看所有标签:git tag
- 查看详细标签:git show v2.0
- 删除标签:git tag -d v3.0
- 推送标签到远程:git push origin v1.0
- 推送所有标签:git push origin --tags
- 删除远端标签:
git tag -d v1.0
git push origin :refs/tags/v1.0
8、解决冲突
- 更新本地代码:git pull
- 查看状态:git status
- 手动修改,删除冲突内容
- 重新提交:git add 、 git commit
9、参考教程
廖雪峰Git教程
Gitee教程
10、示例代码
[root@ecs-xxx ~]# git
-bash: git: command not found
[root@ecs-xxx ~]#
[root@ecs-xxx ~]# sudo apt-get install git
sudo: apt-get: command not found
[root@ecs-xxx ~]#
[root@ecs-xxx ~]# yum install git
Loaded plugins: fastestmirror
Complete!
[root@ecs-xxx ~]# git version
git version 1.8.3.1
[root@ecs-xxx ~]# whereis git
git: /usr/bin/git /usr/share/man/man1/git.1.gz
[root@ecs-xxx ~]# pwd
/root
[root@ecs-xxx /]# cd home
[root@ecs-xxx home]# mkdir learngit
[root@ecs-xxx home]# cd learngit
[root@ecs-xxx learngit]# pwd
/home/learngit
[root@ecs-xxx learngit]# git init
Initialized empty Git repository in /home/learngit/.git/
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# ls -a
. .. .git
[root@ecs-xxx learngit]# touch readme.txt
[root@ecs-xxx learngit]# ls
readme.txt
[root@ecs-xxx learngit]# vim readme.txt
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
[root@ecs-xxx learngit]# git add readme.txt
[root@ecs-xxx learngit]# git commit -m 'wrote a readme file.'
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@ecs-xxx.(none)')
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git config --global user.email "xxxxxx@email.com"
[root@ecs-xxx learngit]# git config --global user.name "xxxxxx"
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git config --list
user.email=xxxxxx@email.com
user.name=xxxxx
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git@gitee.com:xxxxx/learngit.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git commit -m 'wrote a readme file.'
[master (root-commit) af264a5] wrote a readme file.
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
[root@ecs-xxx learngit]# vim readme.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git diff
diff --git a/readme.txt b/readme.txt
index 1a0762b..68fe139 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
Git is a version control system.
xf
+Git is free software.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git add readme.txt
[root@ecs-xxx learngit]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git commit -m "add new line"
[master 910aa81] add new line
1 file changed, 1 insertion(+)
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git status
# On branch master
nothing to commit, working directory clean
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# vim readme.txt
[root@ecs-xxx learngit]# git add readme.txt
[root@ecs-xxx learngit]# git commit -m "add system time"
[master 331832a] add system time
1 file changed, 1 insertion(+)
[root@ecs-xxx learngit]# git status
# On branch master
nothing to commit, working directory clean
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git log
commit af264a5ada2e059ad822d7121fa2e595129198de
Author: xxxxxx <xxxxxx@email.com>
Date: Thu Mar 2 10:01:05 2023 +0800
:
Date: Thu Mar 2 10:06:21 2023 +0800
add system time
commit 910aa81c9bade65244b9ba43a74f225dc931f22e
Author: xxxxxx <xxxxxx@email.com>
Date: Thu Mar 2 10:03:55 2023 +0800
add new line
commit af264a5ada2e059ad822d7121fa2e595129198de
Author: xxxxxx <xxxxxx@email.com>
Date: Thu Mar 2 10:01:05 2023 +0800
wrote a readme file.
[1]+ Stopped git log
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git log --pretty=oneline
331832aa56734d0f34517fd246ceb32b32ed20a2 add system time
910aa81c9bade65244b9ba43a74f225dc931f22e add new line
af264a5ada2e059ad822d7121fa2e595129198de wrote a readme file.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git reset --hard HEAD^
HEAD is now at 910aa81 add new line
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git log
commit 910aa81c9bade65244b9ba43a74f225dc931f22e
Author: xxxxxx <xxxxxx@email.com>
Date: Thu Mar 2 10:03:55 2023 +0800
add new line
commit af264a5ada2e059ad822d7121fa2e595129198de
Author: xxxxxx <xxxxxx@email.com>
Date: Thu Mar 2 10:01:05 2023 +0800
wrote a readme file.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# touch license.txt
[root@ecs-xxx learngit]# vim license.txt
[root@ecs-xxx learngit]# git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# license.txt
nothing added to commit but untracked files present (use "git add" to track)
[root@ecs-xxx learngit]# vim readme.txt
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# license.txt
no changes added to commit (use "git add" and/or "git commit -a")
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git add readme.txt
[root@ecs-xxx learngit]# git add license.txt
[root@ecs-xxx learngit]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: license.txt
# modified: readme.txt
#
[root@ecs-xxx learngit]# git commit -m "add new file license.txt"
[master 40b3936] add new file license.txt
2 files changed, 2 insertions(+)
create mode 100644 license.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git status
# On branch master
nothing to commit, working directory clean
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# vi readme.txt
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
My stupid boss.
[root@ecs-xxx learngit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git checkout -- readme.txt
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# vi readme.txt
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
Fuck!!
[root@ecs-xxx learngit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git add readme.txt
[root@ecs-xxx learngit]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
Fuck!!
[root@ecs-xxx learngit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git checkout -- readme.txt
[root@ecs-xxx learngit]# git status
# On branch master
nothing to commit, working directory clean
[root@ecs-xxx learngit]# cat readme.txt
Git is a version control system.
xf
Git is free software.
2023/3/2
Git has a mutable index called stage.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# touch test.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# test.txt
nothing added to commit but untracked files present (use "git add" to track)
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git add test.txt
[root@ecs-xxx learngit]# git commit -m "add test.txt"
[master cd18992] add test.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.txt
[root@ecs-xxx learngit]# git status
# On branch master
nothing to commit, working directory clean
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# rm test.txt
rm: remove regular empty file ‘test.txt’? y
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# ls
license.txt readme.txt
[root@ecs-xxx learngit]# git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@ecs-xxx learngit]# git checkout -- test.txt
[root@ecs-xxx learngit]# ls
license.txt readme.txt test.txt
[root@ecs-xxx learngit]#
[root@ecs-fjx learngit]#
[root@ecs-fjx learngit]# git reflog
6aca85e HEAD@{0}: rebase finished: returning to refs/heads/master
6aca85e HEAD@{1}: pull --rebase origin master: add test.txt
1149b68 HEAD@{2}: pull --rebase origin master: add new file license.txt
283dd5f HEAD@{3}: pull --rebase origin master: add system time
92808ba HEAD@{4}: pull --rebase origin master: add new line
2b29c43 HEAD@{5}: pull --rebase origin master: wrote a readme file.
58bbad5 HEAD@{6}: checkout: moving from master to 58bbad55beedbb8e07a334b18dcf0694ab6fa291^0
cd18992 HEAD@{7}: commit: add test.txt
40b3936 HEAD@{8}: commit: add new file license.txt
331832a HEAD@{9}: reset: moving to 331832
910aa81 HEAD@{10}: reset: moving to HEAD^
331832a HEAD@{11}: commit: add system time
910aa81 HEAD@{12}: commit: add new line
af264a5 HEAD@{13}: commit (initial): wrote a readme file.
[root@ecs-fjx learngit]#
[root@ecs-xxx ~]# ssh-keygen -t rsa -C "xxxxxx@email.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX email@email.com
The key's randomart image is:
+---[RSA 2048]----+
+----[SHA256]-----+
[root@ecs-xxx ~]#
[root@ecs-xxx ~]# ls -a
. .bash_history .bash_profile .cshrc .history .pki .tcshrc
.. .bash_logout .bashrc .gitconfig mirrors_source.sh .ssh .viminfo
[root@ecs-xxx ~]# cd .ssh
[root@ecs-xxx .ssh]# ls
authorized_keys id_rsa id_rsa.pub
[root@ecs-xxx .ssh]# cat id_rsa.pub
[root@ecs-xxx learngit]# git remote add origin git@gitee.com:xxxxx/learngit.git
[root@ecs-xxx learngit]# git remote -v
origin git@gitee.com:xxxxx/learngit.git (fetch)
origin git@gitee.com:xxxxx/learngit.git (push)
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git status
# On branch master
nothing to commit, working directory clean
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git pull
warning: no common commits
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From gitee.com:xxxxx/learngit
* [new branch] develop -> origin/develop
* [new branch] feature -> origin/feature
* [new branch] master -> origin/master
* [new branch] release -> origin/release
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> master
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# ls
license.txt readme.txt test.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git push -u origin master
Warning: Permanently added the ECDSA host key for IP address '212.64.63.190' to the list of known hosts.
To git@gitee.com:xxxxx/learngit.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@gitee.com:xxxxx/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git pull --reabse origin master
error: unknown option `reabse'
usage: git fetch [<options>] [<repository> [<refspec>...]]
or: git fetch [<options>] <group>
or: git fetch --multiple [<options>] [(<repository> | <group>)...]
or: git fetch --all [<options>]
-v, --verbose be more verbose
-q, --quiet be more quiet
--all fetch from all remotes
-a, --append append to .git/FETCH_HEAD instead of overwriting
--upload-pack <path> path to upload pack on remote end
-f, --force force overwrite of local branch
-m, --multiple fetch from multiple remotes
-t, --tags fetch all tags and associated objects
-n do not fetch all tags (--no-tags)
-p, --prune prune remote-tracking branches no longer on remote
--recurse-submodules[=<on-demand>]
control recursive fetching of submodules
--dry-run dry run
-k, --keep keep downloaded pack
-u, --update-head-ok allow updating of HEAD ref
--progress force progress reporting
--depth <depth> deepen history of shallow clone
--unshallow convert to a complete repository
[root@ecs-xxx learngit]# git pull --rebase origin master
From gitee.com:xxxxx/learngit
* branch master -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: wrote a readme file.
Applying: add new line
Applying: add system time
Applying: add new file license.txt
Applying: add test.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# ls
license.txt README.en.md README.md readme.txt test.txt
[root@ecs-xxx learngit]#
[root@ecs-xxx learngit]# git push -u origin master
Counting objects: 17, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (16/16), 1.32 KiB | 0 bytes/s, done.
Total 16 (delta 6), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To git@gitee.com:xxxxx/learngit.git
58bbad5..6aca85e master -> master
Branch master set up to track remote branch master from origin.
[root@ecs-xxx learngit]#