Git简单说明
保留原文链接:https://www.yiibai.com/git/getting-started-git-basics.html
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。工作目录、暂存区域以及 Git 仓库如下图所示 -
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作‘索引’,不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在Git 基础一章,你会进一步了解这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。
常用命令
注意: git只会对文件有反应,如果创建一个空文件夹,git status是不会有反应的。
help
查看某一个命令的帮助
git help clone
#按 F 可以向下查看帮助
#按 B 可以向上查看帮助
#按 q 退出帮助
config
Git 前的配置,设置你的全局的用户,邮箱,打开的编辑器,对比工具,颜色等。 如果是具体到某一个项目也可以在进行设置。
#这个文件也同时在你当前用户的
cat ~/.gitconfig
#查看你的git配置
git config --global --list
#查看Git认为的一个特定的关键字目前的值
git config --global user.name
#增
git config --global --add user.name jianan
#全局设置你的用户名和邮箱
$ git config --global user.name "wirelessqa"
$ git config --global user.email wirelessqa.me@gmail.com
#删
git config --global --unset user.name
#改
git config --global user.name jianan
查看项目配置
git config --local --list
修改当前项目配置
cd /Users/maizi/Desktop/demo/.git/config #进入到当前项目目录的.git文件夹下面,修改config文件
init
初始化一个项目,如果不需要这个项目了,就把这个.git删除掉。 这个我们一般不需要改动。
➜ Desktop mkdir gitDemo
➜ gitDemo git init
Initialized empty Git repository in /Users/maizi/Desktop/gitDemo/.git/
➜ gitDemo git:(master) ls -a
. .. .git
➜ gitDemo git:(master)
➜ .git git:(master) ll
total 24
-rw-r--r-- 1 maizi staff 23B Apr 29 17:33 HEAD
#这个config是项目的配置文件
-rw-r--r-- 1 maizi staff 137B Apr 29 17:33 config
-rw-r--r-- 1 maizi staff 73B Apr 29 17:33 description
drwxr-xr-x 13 maizi staff 442B Apr 29 17:33 hooks
drwxr-xr-x 3 maizi staff 102B Apr 29 17:33 info
drwxr-xr-x 4 maizi staff 136B Apr 29 17:33 objects
drwxr-xr-x 4 maizi staff 136B Apr 29 17:33 refs
commit
一次将暂存区中的内容提交到版本库中, 通过git status状态可以看出详细的流程。
➜ gitDemo git:(master) git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
➜ gitDemo git:(master) touch maizi.text
➜ gitDemo git:(master) ✗ ls
maizi.text
➜ gitDemo git:(master) ✗ vi maizi.text
➜ gitDemo git:(master) ✗ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
maizi.text
nothing added to commit but untracked files present (use "git add" to track)
➜ gitDemo git:(master) ✗ git add maizi.text
➜ gitDemo git:(master) ✗ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: maizi.text
➜ gitDemo git:(master) ✗ git commit -m '提交说明信息'
[master (root-commit) 2391282] 提交说明信息
1 file changed, 2 insertions(+)
create mode 100644 maizi.text
➜ gitDemo git:(master) git status
On branch master
nothing to commit, working tree clean
#查看提交的信息
➜ gitDemo git:(master) git log
commit 2391282c01732cf6c3269fafc62bccefa55f1dae (HEAD -> master)
Author: maizitoday <maizi_today@sina.com>
Date: Mon Apr 29 17:39:13 2019 +0800
提交说明信息
(END)
diff
工作区(work dict)和暂存区(stage)的比较,为了防止工作区的修改没有被提交到暂存区中,或则查看工作区和暂存区之间的差异,可以使用git diff指令。
缓存区比较
➜ gitDemo git:(master) ✗ 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: maizi.text
no changes added to commit (use "git add" and/or "git commit -a")
➜ gitDemo git:(master) ✗ git diff maizi.text
#同时对比完成后, 需要add后,然后才能commit, 如果直接commit,文件是无法提交的。
分支比较
➜ gitDemo git:(company) git diff master..company
#具体比较两个分支里面的一个文件
➜ xiaoqiang git:(company) ls
tody.txt
➜ xiaoqiang git:(company) git diff master..company tody.txt
rename
重命名已经命名的文件,下面的mv命令更加简单。
➜ gitDemo git:(master) ls
maizi.text
➜ gitDemo git:(master) mv maizi.text maizi_today.text
➜ gitDemo git:(master) ✗ ls
maizi_today.text
➜ gitDemo git:(master) ✗ 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: maizi.text
Untracked files:
(use "git add <file>..." to include in what will be committed)
maizi_today.text
no changes added to commit (use "git add" and/or "git commit -a")
➜ gitDemo git:(master) ✗ git rm maizi.text
rm 'maizi.text'
➜ gitDemo git:(master) ✗ git add maizi_today.text
➜ gitDemo git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: maizi.text -> maizi_today.text
➜ gitDemo git:(master) ✗ git commit -m "重命名"
[master 3f4add1] 重命名
1 file changed, 0 insertions(+), 0 deletions(-)
rename maizi.text => maizi_today.text (100%)
➜ gitDemo git:(master)
mv
重命名和移动文件, 和Linux一样。
#重命名
➜ gitDemo git:(master) git mv maizi_today.text tody.txt
➜ gitDemo git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: maizi_today.text -> tody.txt
➜ gitDemo git:(master) ✗ git commit -m "重命名文件"
[master 5491bd8] 重命名文件
1 file changed, 0 insertions(+), 0 deletions(-)
rename maizi_today.text => tody.txt (100%)
➜ gitDemo git:(master) git status
On branch master
nothing to commit, working tree clean
➜ gitDemo git:(master)
#移动文件
➜ gitDemo git:(master) ls
tody.txt xiaoqiang
➜ gitDemo git:(master) git mv tody.txt xiaoqiang
➜ gitDemo git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: tody.txt -> xiaoqiang/tody.txt
➜ gitDemo git:(master) ✗ git commit -m "移动目录"
[master 4b048a4] 移动目录
1 file changed, 0 insertions(+), 0 deletions(-)
rename tody.txt => xiaoqiang/tody.txt (100%)
➜ gitDemo git:(master) ls
xiaoqiang
➜ gitDemo git:(master)
rm
➜ gitDemo git:(master) git rm -r xiaoqiang
rm 'xiaoqiang/tody.txt'
➜ gitDemo git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: xiaoqiang/tody.txt
➜ gitDemo git:(master) ✗ git commit -m "删除文件"
[master fcf6d55] 删除文件
1 file changed, 4 deletions(-)
delete mode 100644 xiaoqiang/tody.txt
➜ gitDemo git:(master) git status
On branch master
nothing to commit, working tree clean
➜ gitDemo git:(master)
checkout
命令用于切换分支或恢复工作树文件
切换分支
➜ gitDemo git:(work) git checkout company #切换分支
恢复工作树文件
#删除文件,还没有提交的文件恢复
➜ gitDemo git:(master) git rm xiaoqiang/tody.txt
rm 'xiaoqiang/tody.txt'
➜ gitDemo git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: xiaoqiang/tody.txt
➜ gitDemo git:(master) ✗ ls
# HEAD : 表示最近一次提交 --:表示当前分支
➜ gitDemo git:(master) ✗ git checkout HEAD -- xiaoqiang/tody.txt
➜ gitDemo git:(master) git status
On branch master
nothing to commit, working tree clean
➜ gitDemo git:(master) ls
xiaoqiang
➜ gitDemo git:(master) cd xiaoqiang
➜ xiaoqiang git:(master) ls
tody.txt
➜ xiaoqiang git:(master)
#---------------------------------------------#
#删除文件,已经提交了, 进行文件恢复
➜ gitDemo git:(master) ls
xiaoqiang
➜ gitDemo git:(master) git rm -rf xiaoqiang
rm 'xiaoqiang/tody.txt'
➜ gitDemo git:(master) ✗ git commit -m "删除文件"
[master b25edc3] 删除文件
1 file changed, 4 deletions(-)
delete mode 100644 xiaoqiang/tody.txt
➜ gitDemo git:(master) ls
# HEAD^: 表示最近的提交的上一次提交。 HEAD^^ 上两次的提交 --:表示当前分支
➜ gitDemo git:(master) git checkout HEAD^ -- xiaoqiang
➜ gitDemo git:(master) ✗ ls
xiaoqiang
➜ gitDemo git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: xiaoqiang/tody.txt
➜ gitDemo git:(master) ✗ git commit -m "恢复删除文件"
[master ce2420c] 恢复删除文件
1 file changed, 4 insertions(+)
create mode 100644 xiaoqiang/tody.txt
➜ gitDemo git:(master) ls
xiaoqiang
➜ gitDemo git:(master)
revert
恢复到某一个提交之前的数据。
gitDemo git:(master) git log --oneline
ce2420c (HEAD -> master) 恢复删除文件
b25edc3 删除文件
c0c668d 恢复已经删除文件
fcf6d55 删除文件
4b048a4 移动目录
5491bd8 重命名文件
3f4add1 重命名
e2fc445 测试
2391282 提交说明信息
(END)
gitDemo git:(master) git revert ce2420c
#数据恢复到这个log记录之前
reset
感觉就是设置一个指针, 这个指针会告诉我们下次或者这次提交代码时候,重新的一个起点指针。
➜ gitDemo git:(master) git log --oneline
dcb0636 (HEAD -> master) Revert "删除文件"
341fa18 删除文件
7a39e4a Revert "测试"
ce2420c 恢复删除文件
b25edc3 删除文件
c0c668d 恢复已经删除文件
fcf6d55 删除文件
4b048a4 移动目录
5491bd8 重命名文件
3f4add1 重命名
e2fc445 测试
2391282 提交说明信息
git reset (–mixed) HEAD~1 | git reset (–mixed) 341fa18
回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也
不受影响)
git reset –soft HEAD~1 | git reset –soft 341fa18
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
git reset –hard HEAD~1 | git reset –hard 341fa18
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
branch
➜ gitDemo git:(work) git branch company #创建分支
➜ gitDemo git:(work) git branch #查看所有分支
➜ gitDemo git:(work) git checkout company #切换分支
Switched to branch 'company'
➜ gitDemo git:(company) git status #查看当前git是哪个分支
On branch company
nothing to commit, working tree clean
➜ gitDemo git:(company)
➜ gitDemo git:(master) git branch -m work woro_relname #重命名分支
➜ gitDemo git:(master) git branch -d woro_relname #删除分支
➜ gitdemo git:(master) git branch -r #查看远程分支
merge
➜ xiaoqiang git:(master) git checkout master #切换到主分支
➜ xiaoqiang git:(master) git merge company #合并 company分支
#如下合并文件冲突
<<<<<<< HEAD
我是master分支
=======
我是company分支
>>>>>>> company
#手动删除这些提示出来的冲突文字, 然后在进行 git add 和 git commit 就好,一般开发时候都是通过IDEA进行判对比后,然后在进行提交。
log
#--graph 图形效果
#--oneline 一行命令信息
➜ gitDemo git:(master) git log --oneline --decorate -10 --graph
* 9744119 (HEAD -> master) Merge branch 'company'
|\
| * 366379a (company) company修改
* | 5e4ff50 master修改
* | edfb18a master修改
|/
* 190280e company分支
* dcb0636 (work) Revert "删除文件"
* 341fa18 删除文件
* 7a39e4a Revert "测试"
* ce2420c 恢复删除文件
* b25edc3 删除文件
#作者,过滤
➜ gitDemo git:(master) git log --oneline
--author='' -10
--grep='删除'
--before='2019-4-2' | --before='1 week'| --before='3 days'
stash
如果修改了A,B,C3个文件, 但是修改了A的这个文件我现在提交的时候, 不想和B,C文件一起提交,这个时候,就可以用到这个命令了。 注意: 这个命令是按照你现在执行的阶段来的。
#保存执行这个命令之前的所有操作
➜ gitDemo git:(master) ✗ git stash save '修改了a.txt'
#查看有几个,stash@{0}是他的标志,在这命令显示出来的
➜ gitDemo git:(master) git stash list
#重新激活应用这个保存进度
➜ gitDemo git:(master) git stash apply stash@{0}
#效果如下
➜ gitDemo git:(master) ✗ 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: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
# 删除这个保存进度
➜ gitDemo git:(master) ✗ git stash drop stash@{0}
➜ gitDemo git:(master) ✗ git stash pop
gitignore
可以给每一个项目, 确定哪一些文件是可以忽略的。直接在项目的主目录创建.gitignore文件,添加过滤规则。
➜ gitDemo git:(master) cat .gitignore
*.log
➜ gitDemo git:(master) touch a.log
➜ gitDemo git:(master) git status
On branch master
nothing to commit, working tree clean
➜ gitDemo git:(master)
remote
# origin 远程名称, 一般默认是这个
git remote add origin https://github.com/maizitoday/gitDemo.git
# 查看拉取和推送
➜ gitdemo git:(master) git remote -v
origin https://github.com/maizitoday/gitDemo.git (fetch)
origin https://github.com/maizitoday/gitDemo.git (push)
pull/push
本地库推送到远程 ,如:github
➜ gitdemo git init
➜ gitdemo git:(master) git remote add origin https://github.com/maizitoday/gitDemo.git
#需要先拉取下来, 如果直接推送会出现下面错误:
error: failed to push some refs to 'https://github.com/maizitoday/gitDemo.git'
#先拉取
➜ gitdemo git:(master) git pull origin master
#在推送
➜ gitdemo git:(master) git push -u origin master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes | 277.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/maizitoday/gitDemo.git
52a6598..51415bf master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
-u 这个参数表示跟踪服务器上面的master分支
#Branch 'master' set up to track remote branch 'master' from 'origin'.
#推送其他分支, 没有加-u
➜ gitdemo git:(master) git push origin work
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'work' on GitHub by visiting:
remote: https://github.com/maizitoday/gitDemo/pull/new/work
remote:
To https://github.com/maizitoday/gitDemo.git
* [new branch] work -> work
remote workflow
clone
克隆一个项目,取一个本地名字,然后修改文件,推送到服务端
➜ Desktop git clone https://github.com/maizitoday/gitDemo.git maizi_git_demo
➜ maizi_git_demo git:(master) vi a.txt
➜ maizi_git_demo git:(master) ✗ git commit -am '提交'
[master c095f2e] 提交
1 file changed, 1 insertion(+)
➜ maizi_git_demo git:(master) git remote
origin
➜ maizi_git_demo git:(master) git push origin master
fetch
应用场景: 当我手动在github上面修改了[README.md]这个文件的时候, 我本地直接查看如下:
➜ maizi_git_demo git:(master) git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
➜ maizi_git_demo git:(master)
显示我的本地和远程是同步的: Your branch is up to date with ‘origin/master’.所以多人协作的时候,就需要这个命令了。
# 调用 fetch 命令 提取一下最新代码(针对多人开发)
➜ maizi_git_demo git:(master) git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/maizitoday/gitDemo
c095f2e..2ea8a42 master -> origin/master
➜ maizi_git_demo git:(master)
#查看现在状态
➜ maizi_git_demo git:(master) git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
#本地用户和服务器另一个用户提交的进行合并分支
➜ maizi_git_demo git:(master) git merge origin/master
Updating 2ea8a42..e062b17
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
#现在查看已经同步数据了
➜ maizi_git_demo git:(master) git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
fork
就是把github上面的一个项目迁移到自己的github账号里面,用于自己基于这个项目来进行开发。
pull-request
当你在github上面看大一个项目有bug,需要进行修改的时候,你就可以看到在github上面有一个pull-request,然后你创建一个pull-request, 选择好项目的版本和文件,然后选择你的版本和文件, 然后一步一步操作, 就可以对线上的项目进行BUG的修复了。
collaborator
可以邀请github的账户,打开项目共享者列表, 一起来开发协助开发。 具体查看github上面的操作。
本地文件上传到github
把现在已经生成的文件,上传到github,进行同步, 我这里直接把博客的文章上传到github中。
➜ content git init
➜ content git:(master) ✗ git remote add origin https://github.com/maizitoday/myblogNotes.git
➜ gitdemo git:(master) git pull origin master
➜ content git:(master) ✗ git add .
➜ content git:(master) ✗ git commit -am '博客文章'
➜ content git:(master) git push -u origin master
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付