使用Git Bash控制台
常用命令:
pwd
显示当前所在的路径
ll
显示当前目录下的所有文件及文件信息(不含隐藏文件)
ls
显示当前目录下的所有文件(不含隐藏文件、不含文件信息)
ll -A
显示当前目录下的所有文件及文件信息(含隐藏文件)
ls -A
显示当前目录下的所有文件(含隐藏文件、不含文件信息)
~
表示当前系统用户的根目录
:set nu
在vim编辑器中可以显示行号信息
Git 帮助命令
git help <要查看的命令>
可查看帮助文档
Git的区域概述
1. 初始化本地库
- 使用
mkdir FileName
命令,在当前目录创建一个工作目录(文件夹)
Miner01@DESKTOP-OSMGCMV MINGW64 /c
$ mkdir workspaces
- 使用
git init
命令,在当前目录初始化Git本地库
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit
$ git init
Initialized empty Git repository in C:/workspaces/MyGit/.git/
# 译:
# 在 C:/workspaces/MyGit/.git/目录,初始化了空的Git仓库
- 使用
ll
命令查看.git目录下的所有文件
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ ll .git/
total 7
-rw-r--r-- 1 Miner01 197121 130 11月 11 21:12 config
-rw-r--r-- 1 Miner01 197121 73 11月 11 21:12 description
-rw-r--r-- 1 Miner01 197121 23 11月 11 21:12 HEAD
drwxr-xr-x 1 Miner01 197121 0 11月 11 21:12 hooks/
drwxr-xr-x 1 Miner01 197121 0 11月 11 21:12 info/
drwxr-xr-x 1 Miner01 197121 0 11月 11 21:12 objects/
drwxr-xr-x 1 Miner01 197121 0 11月 11 21:12 refs/
注意! .git/目录及子目录中的任何文件不能随意修改及删除!
2. 设置签名
作用:区分不同开发人员
此签名与远程库【托管中心】的账户、密码无关
-
用户级别/仓库级别(仅在当前本地库范围内有效)
git config user.name 你的仓库级别的用户名
git config user.email 邮箱地址
保存位置 ./.git/config
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master) $ cat .git/config [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [user] name = ****** email = an******@aliyun.com
-
系统用户级别(登陆当前操作系统的用户范围)
git config --global user.name 你的系统用户级别的用户名
git config --global user.email 邮箱地址
保存位置 ~/.gitconfig
Miner01@DESKTOP-OSMGCMV MINGW64 ~ $ cat ~/.gitconfig [user] name = ****** email = an******@aliyun.com
-
优先级(就近原则)
- 两个级别的用户同时存在时,仓库级别优先于系统用户级别
- 只有某一个级别的签名时,以签名的所属级别为准
- 两个级别的签名都没有,会报错,不被允许
3. 查看状态
- 查看状态命令
git status
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git status
On branch master | 当前所在的分支为master
No commits yet | 还没有提交(指本地库)
nothing to commit (create/copy files and use "git add" to track) | 没有可提交的内容(指暂存区)
(创建或复制一个文件到工作区并使用 "git add" 命令去追踪它)
- 使用vim编辑器创建一个名为demo.txt的文件(按i键进入编辑模式,编辑完成后按Esc键,输入:wq保存退出)
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ vim demo.txt
- 再次使用
git status
命令,查看状态
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git status
On branch master | 当前所在的分支为master
No commits yet | 还没有提交(指本地库)
Untracked files: | 未跟踪的文件
(use "git add <file>..." to include in what will be committed) | 使用"git add <file>..."命令添加到缓存区
demo.txt | 红色显示未跟踪的文件名
nothing added to commit but untracked files present (use "git add" to track) | 没有添加任何提交的内容,但存在未跟踪的文件
(使用 "git add" 进行跟踪)
- 使用
git add
命令,追踪未追踪的文件
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git add demo.txt
warning: LF will be replaced by CRLF in demo.txt. | 警告: 在demo.txt中,LF将被CRLF取代
The file will have its original line endings in your working directory | 该文件将在您的工作目录中具有其原始行结尾
- 再次使用
git status
命令,查看状态
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git status
On branch master | 当前所在的分支为master
No commits yet | 还没有提交(指本地库)
Changes to be committed: | 需要提交的更改
(use "git rm --cached <file>..." to unstage) | (使用 "git rm --cached <文件名>…" 命令,从暂存区删除文件,还原未追踪状态)
new file: demo.txt | 绿色显示已追踪且存入暂存区的文件名
- 使用
git commit -m "本次提交内容的简要说明"
命令,提交暂存区的文件到本地库
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git commit -m "第一次提交本地库测试文件demo.txt"
[master (root-commit) f7d88bb] | 第一次提交本地库测试文件demo.txt
1 file changed, 3 insertions(+) | 本次提交的文件数量,有3行的增量变更
create mode 100644 demo.txt | 创建模式 100644
- 再次使用
git status
命令,查看状态
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git status
On branch master | 当前所在的分支为master
nothing to commit, working tree clean | 没有可提交的内容,工作区与本地库内容一致
- 使用vim修改demo.txt后,再使用
git status
命令,查看状态
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces/MyGit (master)
$ git status
On branch master | 当前所在的分支为master
Changes not staged for commit: | 有更改但未提交到暂存区
(use "git add <file>..." to update what will be committed) | 使用"Git add <file>" 命令,提交更新内容到暂存区
(use "git restore <file>..." to discard changes in working directory) | 使用 "git restore <file>" 放弃工作目录中的更改
modified: demo.txt | 有修改,但未提交的文件名
no changes added to commit (use "git add" and/or "git commit -a")
| 有更改的内容未提交
| 可以先使用 "git add" 提交到缓存区再使用 "git commit -a" 命令,提交更改到本地库
| 也可以直接使用 "git commit -a"命令,提交更改到本地库
4. 查看本地库日志
- 使用
git log
命令
查看本地库的全部日志信息
内容太多一屏幕显示不下的话:使用空格键
向下翻页,B键
向上翻页,Q键
退出
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git log
commit 02c13fff55888f62ced9961ce3ef63441f4e857f (HEAD -> master) | 哈希值及指针指向的分支
Author: N5DL80 <andy_800929@aliyun.com> | 提交者信息
Date: Tue Nov 12 14:04:10 2019 +0800 | 提交日期时间
第一次提交本地库 demo.txt
- 使用
git log --pretty=oneline
命令
查看列表形式的日志信息,不显示提交信息
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git log --pretty=oneline
02c13fff55888f62ced9961ce3ef63441f4e857f (HEAD -> master) 第一次向本地库提交 demo.txt
- 使用
git log --oneline
命令
查看列表形式的日志信息,不显示提交信息,并简化哈希值
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git log --oneline
02c13ff (HEAD -> master) 第一次向本地库提交 demo.txt
- 使用
git reflog
命令
查看列表形式的日志信息,不显示提交信息,并简化哈希值且显示指针索引
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git reflog
a6a680c (HEAD -> master) HEAD@{0}: commit: 第三次向本地库提交 demo.txt
17983a6 HEAD@{1}: commit: 第二次向本地库提交 demo.txt
02c13ff HEAD@{2}: commit (initial): 第一次向本地库提交 demo.txt
5. 基于历史版本的回滚及前进
- 使用
git reset --hard <索引值>
命令,基于索引值(根据版本的索引值可进可退)
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git reset --hard 02c13ff
HEAD is now at 02c13ff 第一次向本地库提交 demo.txt | 回滚后指针指向的版本
- 使用
git reset --hard HEAD^
命令,基于^
符号 (只能向后回滚,且一个^
符号向后退一步,可多个^
符号一起使用)
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git reset --hard HEAD^
HEAD is now at 17983a6 第二次向本地库提交 demo.txt
- 使用
git reset --hard HEAD~<要回滚的步数>
命令,基于~
符号(只能向后回滚)
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master)
$ git reset --hard HEAD~1
HEAD is now at 02c13ff 第一次向本地库提交 demo.txt
- reset 的三个参数
-
git reset --soft
命令- 仅仅在本地库移动HEAD指针(不会重置暂存区和工作区)
-
git reset --mixed
命令- 在本地库移动HEAD指针
- 重置暂存区(使之保持与本地库指针指向的版本内容一致)
-
git reset --hard
命令- 在本地库移动HEAD指针
- 重置暂存区(使之保持与本地库指针指向的版本内容一致)
- 重置工作区(使之保持与本地库指针指向的版本内容一致)
-
-
删除本地库内容
- 第一步,在工作区使用
rm <要删除的文件名>
命令,删除文件
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master) $ rm rm_test.txt
- 第二步,把删除文件这个操作使用
git add <已删除的文件名>
命令,提交的暂存区
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master) $ git add rm_test.txt
- 第三步,把暂存区待执行的操作使用
git commit -m "删除此文件的说明"
提交到本地库
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master) $ git commit -m "删除测试文件" [master c32010a] 删除测试文件 1 file changed, 1 deletion(-) | 执行了一个更改文件的操作,一个文件被删除 delete mode 100644 rm_test.txt | 删除模式100644 删除的文件名:rm_test.txt
- 第一步,在工作区使用
-
找回被删除的文件
- 使用
git reset -- hard <版本的索引>
回滚操作可以找回已经在本地库删除的文件 - 如果工作区删除了文件,并且已经提交到暂存区,但是未提交到本地库的情况下:使用
git reset --hard HEAD
命令,使本地库的指针指向当前版本,并重置暂存区和工作区,就找回了被删除且提交到暂存区的文件
- 使用
-
文件的比较
- 使用
git diff <要比较的文件名>
命令, 将工作区的文件与暂存区的文件比较
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master) $ git diff demo.txt diff --git a/demo.txt b/demo.txt index 8d47907..b9b8e6a 100644 --- a/demo.txt +++ b/demo.txt @@ -1,5 +1,6 @@ 0 111 | 工作区文件与暂存区一致的行 1 222 | 工作区文件与暂存区一致的行 2 -333 | 暂存区的原始文件在本行的内容 2 +3333 | 工作区修改后的文件在本行的内容 3 444 | 工作区文件与暂存区一致的行 4 555 | 工作区文件与暂存区一致的行 5 +666 | 工作区修改后的文件在本行的内容
- 使用
git diff HEAD <要比较的文件名>
命令, 将工作区的文件与本地库当前版本的文件比较
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master) $ git diff HEAD demo.txt diff --git a/demo.txt b/demo.txt index 8d47907..b9b8e6a 100644 --- a/demo.txt +++ b/demo.txt @@ -1,5 +1,6 @@ 0 111 | 工作区文件与本地库一致的行 1 222 | 工作区文件与本地库一致的行 2 -333 | 本地库的原始文件在本行的内容 2 +3333 | 工作区修改后的文件在本行的内容 3 444 | 工作区文件与本地库一致的行 4 555 | 工作区文件与本地库一致的行 5 +666 | 工作区修改后的文件在本行的内容
- 使用
git diff HEAD <版本索引> <要比较的文件名>
命令, 将本地库当前指针指向的版本文件与本地库的指定版本文件比较
Admin@Admin-PC MINGW64 /c/workspaces/MyGit (master) $ git diff HEAD 02c13ff demo.txt diff --git a/demo.txt b/demo.txt index 8d47907..641d574 100644 --- a/demo.txt +++ b/demo.txt @@ -1,5 +1,3 @@ 0 111 | 工作区文件与本地库某历史版本一致的行 1 222 | 工作区文件与本地库某历史版本一致的行 2 333 | 工作区文件与本地库某历史版本一致的行 3 -444 | 工作区文件与本地库某历史版本不一致的行 4 -555 | 工作区文件与本地库某历史版本不一致的行
- 命令最后不带文件名将比较工作区的所有文件
- 使用
-
Git 分支
- 使用
git branch -v
命令,查看当前本地库的所有分支
Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master) $ git branch -v * master 87916d5 新建名为demo.txt的文件
- 使用
git branch <要创建的分支名称>
命令,创建一个分支
Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master) $ git branch test_branch | 创建一个名为test_branch的分支 Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master) $ git branch -v | 查看当前本地库的所有分支 * master 87916d5 新建名为demo.txt的文件 | 当前分支 test_branch 87916d5 新建名为demo.txt的文件 | 新创建的分支
- 使用
git checkout <分支名称>
命令,切换分支
Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master) $ git checkout test_branch Switched to branch 'test_branch' | 切换到分支'test_branch' Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (test_branch) $ 已经切换到了(test_branch)分支
- 使用
git merge <要与当前分支合并的分支名称>
命令,合并分支
注意!合并前确保当前分支为被更新的分支
Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master) $ git merge test_branch | 把(test_barch)分支上的修改合并到当前(master)分支上 Updating 87916d5..cf8ec68 | 更新版本 Fast-forward | 快进(不明所以) demo.txt | 1 + | 受影响的文件名 | 1条内容受到影响 1 file changed, 1 insertion(+) | 一个文件被更改了,插入了一行
- 分支冲突
当两个分支的同一个文件的同一行同时被修改时,会产生冲突
Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master) $ git merge test_branch | 合并分支命令 Auto-merging demo.txt | 自动合并 demo.txt CONFLICT (content): Merge conflict in demo.txt | 合并时demo.txt中存在内容冲突 Automatic merge failed; fix conflicts and then commit the result. 自动合并失败;修复冲突,然后提交结果 Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master|MERGING) | 修复模式 $ 在这里键入命令修复何必冲突
- 解决冲突,使用
vim <冲突的文件名称>
命令,打开冲突文件
new file name demo.txt 在test_branch分支做了此行修改,用于测试合并分支 <<<<<<< HEAD | Git添加的冲突标记 测试合并分支已完成 | 这部分为当前master分支demo.txt的更新内容 在master分支修改demo.txt第4行,用于测试合并冲突 ======= | Git添加的冲突标记 合并分支测试完成 | 这部分为test_branch分支demo.txt的更新内容 在test_branch分支中修改demo.txt文件的第4行,用于测试合并分支冲突 >>>>>>> test_branch | Git添加的冲突标记 当产生冲突时git会在适当位置插入标记,来提醒哪个是当前master分支的更新内容, 哪个是test_branch分支的更新内容。删除标记后,编辑文件到满意后保存退出
- 使用
git status
命令,查看状态
Vivian@DESKTOP-KTT0C4K MINGW64 /d/傻/workspaces/DemoGit (master|MERGING) $ git status On branch master | 当前所在的分支为master You have unmerged paths. | 您有未合并的路径 (fix conflicts and run "git commit") | (修复冲突并运行 "git commit" 命令) (use "git merge --abort" to abort the merge) | (使用 "git merge --abort" 命令,终止合并) Unmerged paths: | 未合并的路径: (use "git add <file>..." to mark resolution) | (使用 "git add <文件>" 命令,把已解决的冲突文件提交到暂存区) both modified: demo.txt | 冲突问题被修改好了: demo.txt no changes added to commit (use "git add" and/or "git commit -a") | 有更改的内容未提交 | 可以先使用 "git add" 提交到缓存区再使用 "git commit -a" 命令,提交更改到本地库 | 也可以直接使用 "git commit -a"命令,提交更改到本地库
使用
git add <已解决的冲突的文件名>
命令, 提交到暂存区Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master|MERGING) $ git add demo.txt
使用
git status
命令,查看状态Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master|MERGING) $ git status On branch master | 在master分支上 All conflicts fixed but you are still merging. | 所有冲突已解决,但您仍在合并状态中。 (use "git commit" to conclude merge) | (使用 "git commit" 命令,结束合并状态) Changes to be committed: | 要做更改是: modified: demo.txt | 修改:demo.txt
使用
git commit
命令, 提交修改到本地库并结束合并状态
*在合并状态中使用git commit
命令时,不能带文件名 *Vivian@DESKTOP-KTT0C4K MINGW64 /c/workspaces/DemoGit (master|MERGING) $ git commit -m "冲突已解决,提交修改到本地库" [master 0b2c481] 冲突已解决,提交修改到本地库
- 使用
-
与远程库GitHub进行交互
使用
git remote -v
命令,查看远程库地址别名Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git remote -v $ 目前什么都有
使用
git romote add <别名> <远程库地址>
命令,保存一个远程库地址的别名Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git remote add origin https://github.com/N5DL80/OKExData.git Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git remote -v origin https://github.com/N5DL80/OKExData.git (fetch) | 拉取远程库地址 origin https://github.com/N5DL80/OKExData.git (push) | 推送远程库地址
使用
git push <远程库地址别名> <要推送的分支>
命令, 把本地库的内容推送到远程库Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git push origin master Enumerating objects: 33, done. Counting objects: 100% (33/33), done. Delta compression using up to 4 threads Compressing objects: 100% (32/32), done. Writing objects: 100% (33/33), 551.83 KiB | 5.36 MiB/s, done. Total 33 (delta 0), reused 0 (delta 0) To https://github.com/N5DL80/OKExData.git * [new branch] master -> master
使用
git clone <远程库地址>
命令,拉取远程库的内容到本地当前目录下- 此命令包含三个内容:
- 克隆远程库内容到本地
- 初始化.git/目录
- 创建远程库地址别名origin
Miner01@DESKTOP-OSMGCMV MINGW64 /c/workspaces $ git clone https://github.com/N5DL80/OKExData.git Cloning into 'OKExData'... remote: Enumerating objects: 33, done. remote: Counting objects: 100% (33/33), done. remote: Compressing objects: 100% (32/32), done. remote: Total 33 (delta 0), reused 33 (delta 0), pack-reused 0 Unpacking objects: 100% (33/33), done.
使用
git pull <远程库地址> 或 <远程库地址别名> <远程库分支>
命令,将替代以下两个步骤,同时完成拉取与合并远程库内容到本地库Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git pull https://github.com/N5DL80/OKExData.git From https://github.com/N5DL80/OKExData * branch HEAD -> FETCH_HEAD Updating e024a1c..a154f2b Fast-forward README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md
- 拉取、合并也可分为两个步骤进行
- 使用
git fetch <远程库别名> <要拉取的分支>
命令, 把远程库内容拉取到本地库,但不会合并远程库的分支和本地库的分支,所以本地的内容跟远程库内容并不一致Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git fetch https://github.com/N5DL80/OKExData.git remote: Enumerating objects: 7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (6/6), done. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (6/6), done. From https://github.com/N5DL80/OKExData * branch HEAD -> FETCH_HEAD
- 使用
git merge <远程库分支>
命令, 合并分支后本地内容与远程库内容才会保持一致Miner01@DESKTOP-OSMGCMV MINGW64 ~/Desktop/OKExData (master) $ git merge origin/master Already up to date. | 已经更新了
- 使用
- 此命令包含三个内容: