Git常用命令
环境配置
- 设置用户名和email地址,每次Git提交都会使用该用户信息。
git config --global user.name "lvshui5u"
git config --global user.email "lvshui5u@qq.com"
- 查看配置信息
git config --list
git config user.name
git config user.email
$ git config user.name
lvshui5u
$ git config user.email
lvshui5u@qq.com
通过上述命令进行配置的信息会保存在~/.gitconfig文件中
找到当前用户下的.gitconfig文件,打开后
[user]
name = lvshui5u
email = lvshui5u@qq.com
获取Git仓库
创建一个目录D:\GitRepos
- 本地初始化一个Git仓库
在上述目录中新建一个repo1文件夹,进入后右击进入Git Bash
git init
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/repo1
$ git init
Initialized empty Git repository in D:/GitRepos/repo1/.git/
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/repo1 (master)
$
初始化了一个空的git repository
该.git文件为隐藏文件
- 远程仓库克隆(以gitee为例)
回到D:\GitRepos目录
git clone
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos
$ git clone https://gitee.com/lvshui5u/test-repo.git
Cloning into 'test-repo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), done.
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos
$
部分概念
- 版本库:.git隐藏文件夹即版本库,其中存储了很多配置信息、日志信息和文件版本信息等。
- 工作目录:存放开发代码的区域,也包括.git文件,即可认为是上述的repo1文件夹和repo-test文件夹。
- 暂存区:.git目录下的index文件,也可叫做stage(阶段),是一个临时保存修改文件的区域。
工作目录下的状态
- untracked:未跟踪(没有被纳入到版本控制过程中)
- tracked:已跟踪(又分为三种状态)
unmodified:未修改状态
modified:修改状态
staged:已暂存状态
- 查看文件状态
git status
$ git status
On branch master
Your branch is up to date with 'origin/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: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
- 更加简洁的输出方式
git status -s
$ git status -s
M README.md
?? hello.txt
M 代表modified 已修改状态
?? 代表untracked 未跟踪状态
- 将未跟踪的文件加入到暂存区
git add
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
M README.md
?? hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git add hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
M README.md
A hello.txt
- 取消暂存
git restore --staged
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git restore --staged hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
M README.md
?? hello.txt
- 提交
git commit
git commit -m "logs"
后者伴随一个日志信息,前者会打开一个编辑器要求编辑日志信息
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
M README.md
?? hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git add hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
M README.md
A hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git commit -m "init hello.txt"
[master 5bc3064] init hello.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello.txt
再次查看状态
$ git status -s
M README.md
只剩下一个readme.md文件,此文件被修改但是没有被暂存
hello.txt文件处于已被跟踪且未修改状态
- 删除文件
git rm
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git rm hello.txt
rm 'hello.txt'
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
D hello.txt
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git commit -m "delete hello.txt"
[master cfe243d] delete hello.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 hello.txt
执行rm 指令后hello.txt直接进入暂存区,然后提交
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git status -s
D README.en.md
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git add README.en.md
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git commit -m "delete readme.en.md"
[master 33bb3e9] delete readme.en.md
1 file changed, 36 deletions(-)
delete mode 100644 README.en.md
右键直接删除文件,需要将文件加入暂存区,然后再提交
-
将一些文件加入到忽略列表,无需纳入Git的管理中。
将无需管理的文件加入到.gitignore中。 -
查看日志
git log
$ git log
commit 33bb3e904f4dd91347eb0d68418383fc68a5a35f (HEAD -> master)
Author: lvshui5u <lvshui5u@qq.com>
Date: Thu May 6 15:08:23 2021 +0800
delete readme.en.md
commit cfe243dc06a20efaacce05fd53dd85612ce4d29f
Author: lvshui5u <lvshui5u@qq.com>
Date: Thu May 6 15:04:00 2021 +0800
delete hello.txt
远程仓库
- 查看远程仓库
git remote
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git remote
origin
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo (master)
$ git remote -v
origin https://gitee.com/lvshui5u/test-repo.git (fetch)
origin https://gitee.com/lvshui5u/test-repo.git (push)
clone下来的远程仓库别名默认为origin
- 添加远程仓库
git remote add <别名> <url>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/repo1 (master)
$ git remote add origin https://gitee.com/lvshui5u/test-repo-2.git
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/repo1 (master)
$ git remote -v
origin https://gitee.com/lvshui5u/test-repo-2.git (fetch)
origin https://gitee.com/lvshui5u/test-repo-2.git (push)
- 从远程仓库克隆
git clone
- 移除远程仓库(并不会影响远程仓库本身)
git remote rm
- 从远程仓库中抓取
git fetch
$ git fetch
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), 1.59 KiB | 3.00 KiB/s, done.
From https://gitee.com/lvshui5u/test-repo-2
* [new branch] master -> origin/master
此命令不会自动将新版本合并到本地仓库
需要手动合并
git merge origin/master
- 从远程仓库中拉取
git pull
$ git pull origin master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), 1.59 KiB | 1024 bytes/s, done.
From https://gitee.com/lvshui5u/test-repo-2
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
- 推送到远程仓库中
git push
$ git push origin master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 302 bytes | 302.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/lvshui5u/test-repo-2.git
42c3dea..afcc220 master -> master
事先add和commit
分支操作
- 查看分支
git branch
git branch -r
git branch -a
列出本地分支
列出远程分支
列出所有分支
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch
* master
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch -r
origin/master
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch -a
* master
remotes/origin/master
- 创建分支
git branch <分支名>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch b1
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch
b1
* master
括弧内为当前分支名
*号后为当前分支名
- 切换分支
git checkout <分支名>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git checkout b1
Switched to branch 'b1'
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (b1)
$ git branch
* b1
master
- 合并分支
git merge
在b1分支下add并commit一个新文件,切换到master分支下
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git merge b1
Updating afcc220..ca0fe75
Fast-forward
User.java | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 User.java
合并时会产生冲突吗?
比如在master分支和在b1分支下同时对某个文件进行了修改并commit
在master分支下对User.java进行修改后commit
public class User{
private int num;
private String name;
}
在b1分支下对User.java进行修改后commit
public class User{
private int age;
private String gender;
}
之后回到master分支下合并b1分支
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git merge b1
Auto-merging User.java
CONFLICT (content): Merge conflict in User.java
Automatic merge failed; fix conflicts and then commit the result.
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master|MERGING)
$
可以看到,自动合并失败,需要手动修复冲突然后提交。
打开此时的User.java查看
public class User{
<<<<<<< HEAD
private int num;
private String name;
=======
private int age;
private String gender;
>>>>>>> b1
}
手动修改后add并commit
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master|MERGING)
$ git add User.java
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master|MERGING)
$ git commit -m "update User.java manually"
[master 0e06a45] update User.java manually
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$
- 删除本地分支
git branch -d <分支名>
git branch -D <分支名>
当本地仓库中分支内容改变,没有推送到远程仓库
执意删除需要-D
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch
b1
* master
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch -d b1
Deleted branch b1 (was 0f85c87).
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git branch
* master
- 删除远程仓库
git push <仓库名,origin> -d <分支名>
$ git push origin -d b1
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/lvshui5u/test-repo-2.git
- [deleted] b1
标签操作
- 创建标签
git tag <tagName>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git tag v0.1
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git tag v0.2
- 查看标签
git tag
$ git tag
v0.1
v0.2
- 推送标签
git push <仓库名> <tagName>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git push origin v0.1
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/lvshui5u/test-repo-2.git
* [new tag] v0.1 -> v0.1
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git push origin v0.2
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/lvshui5u/test-repo-2.git
* [new tag] v0.2 -> v0.2
- 检出标签
git checkout -b <分支名> <标签名>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (master)
$ git checkout -b b2 v0.1
Switched to a new branch 'b2'
新建一个分支b2,在该分支打开v0.1标签时状态
- 删除本地标签
git tag -d <tagName>
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (b2)
$ git tag -d v0.1
Deleted tag 'v0.1' (was 0e06a45)
lvshui5u@DESKTOP-J1T9IH9 MINGW64 /d/GitRepos/test-repo-2 (b2)
$ git tag
v0.2
- 删除远程标签
git push origin :refs/tags/<tagName>
$ git push origin :refs/tags/v0.1
remote: Powered by GITEE.COM [GNK-5.0]
To https://gitee.com/lvshui5u/test-repo-2.git
- [deleted] v0.1
使用TortoiseGit管理文件
在IDEA中进行Git管理