安装 git
# mac 环境
brew install git
检查是否安装成功
➜ ~ git --version
git version 2.20.1 (Apple Git-117)
卸载 git
➜ ~ which -a git
/usr/bin/git
➜ ~ cd /usr/bin
➜ bin sudo rm -rf git*
git init
命令
- 对一个空文件,git 初始化。文件名称增加了’git:(master)’,说明初始化成功了。
➜ mygit git init
Initialized empty Git repository in /Users/maimai/Documents/Demo/mygit/.git/
➜ mygit git:(master)
- 查看当前文件目录结构。发现原空文档下,多了一个.git文件夹。
➜ mygit git:(master) tree -a
.
└── .git
├── HEAD # 包含了一个分支的引用,通过这个文件Git可以得到下一次commit的parent,可以理解为指针
├── config # git仓库的配置文件
├── description # 仓库的描述信息,主要给gitweb等git托管系统使用
├── hooks # 存放一些shell脚本,可以设置特定的git命令后触发相应的脚本
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ ├── prepare-commit-msg.sample
│ └── update.sample
├── info # 存放仓库的一些信息
│ └── exclude
├── objects # 存放所有的git对象
│ ├── info
│ └── pack
└── refs
├── heads # 保存当前最新的一次提交的哈希值
└── tags
查看部分文件:
➜ mygit git:(master) cat .git/HEAD # 下一次commit的parent
ref: refs/heads/master
➜ mygit git:(master) cat .git/config # git仓库的配置文件
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
取消 git init 操作的命令为
rm -rf .git
。git 初始化本质是增加了一个.git文件,删除之后即取消了初始化。
文件的状态变化周期
untracked
:未跟踪状态 —— 工作区增加新文件s, 但并没有加入到 git 库, 不参与版本控制。通过 git add 命令变为staged
状态。staged
: 已暂存状态 —— 对已修改文件的当前版本做了标记,存放在一个不可见的暂存区域,做为下次提交的内容的一部分。执行git commit则将修改同步到库中.unmodified
:未修改状态 —— 文件已入库, 即版本库中的文件快照内容与文件夹中完全一致。modified
: 已修改状态 —— 在工作目录下修改了文件。
查看初始状态
初始状态,工作区为最新代码,.git
文件保存版本库和暂存区内容【初始化的 git 项目,无暂存区】
➜ mygit git:(master) git status # 初始状态
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
增加文件
初始状态,增加文件 README.md 后,由初始状态转化为 untracked 状态(修改也存在的文件,状态更新为 modified)
修改内容仅存在本地工作区,版本库和暂存区都与master保持一致,未被修改【.git
文件夹未更新】
➜ mygit git:(master) vi README.md
➜ mygit git:(master) ✗ tree # 查看文档结构,其中添加了一个文件
.
└── README.md
0 directories, 1 file
➜ mygit git:(master) ✗ git status # 增加文件后,查看git状态,更换为 untracked
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
git add .
使用 git add .
命令,将工作区中的修改文件 README.md 放进暂存区。此时处于暂存区的 README.md 文件处于staged状态【.git 目录下增加 index 和 objects/d6/1d841cf82eef2774ac3e57fb5072b9ef67b4fb】
➜ mygit git:(master) ✗ git add README.md # 使用 add 命令,将修改内容放进暂存区
➜ mygit git:(master) ✗ git status # add 命令后,原 untracked 状态修改为committed
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
查看此时 mygit 的结构,发现 .git 文件夹下多了一个index的文件。
➜ mygit git:(master) ✗ tree -a
.
├── .git # 保存项目的元数据、版本和分支的地方
│ ├── HEAD
│ ├── config
│ ├── description
│ ├── hooks
│ │ ├── applypatch-msg.sample
│ │ ├── commit-msg.sample
│ │ ├── fsmonitor-watchman.sample
│ │ ├── post-update.sample
│ │ ├── pre-applypatch.sample
│ │ ├── pre-commit.sample
│ │ ├── pre-merge-commit.sample
│ │ ├── pre-push.sample
│ │ ├── pre-rebase.sample
│ │ ├── pre-receive.sample
│ │ ├── prepare-commit-msg.sample
│ │ └── update.sample
│ ├── index # 暂存区。Git 术语叫做“索引”
│ ├── info
│ │ └── exclude
│ ├── objects # 对象数据库
│ │ ├── d6
│ │ │ └── 1d841cf82eef2774ac3e57fb5072b9ef67b4fb
│ │ ├── info
│ │ └── pack
│ └── refs
│ ├── heads
│ └── tags
└── README.md
10 directories, 19 files
➜ mygit git:(master) ✗ cat .git/index
DIRC_ÛE$Ya�_ÛE$Ya�<��������.�'t�>W�Pr��g�� README.md`��\A�k�$�����mdU%
使用 git ls-files --stage
命令可以查看暂存区内容
➜ mygit git:(master) ✗ git ls-files --stage
100644 0d862c702122bb62b6c21a2fc2f83128aa5a57b3 0 README.md
git丢弃本地修改
git checkout . && git clean -xdf
git commit -m
使用 git commit
命令,将暂存区的目录树写到版本库中。处于 staged 状态的 README.md 处于unmodified 状态。
➜ mygit git:(master) ✗ git commit -m 'first initial' # 提交更新
[master (root-commit) 9d5ae58] first initial
1 file changed, 1 insertion(+)
create mode 100644 README.md
➜ mygit git:(master) git status # 暂存区的文件写入.git文件
On branch master
nothing to commit, working tree clean
非初次提交状态,使用
git commit -a -m 'xxx'
可替代git add
和git commit
过程。直接从本地提交到版本库
git rm
/ git restore
修改文件并提交到暂存区后,使用 git rm --cached {filename}
命令 或 git restore --staged {filename}
,直接从暂存区删除文件,工作区修改保持不变
➜ mygit git:(master) ✗ git rm --cached README.md
rm 'README.md'
➜ mygit git:(master) ✗ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
git checkout
使用 git chekout .
命令 或 git chekout -- {filename}
,工作区的全部或指定文件被替换为暂存区中的文件。工作区的被更新的文件或存在被覆盖的风险。
➜ mygit git:(master) vi demo1.py
➜ mygit git:(master) ✗ python demo1.py
hello word!
➜ mygit git:(master) ✗ git checkout .
Updated 1 path from the index
➜ mygit git:(master) git status
On branch master
nothing to commit, working tree clean
➜ mygit git:(master) ls
README.md demo1.py
➜ mygit git:(master) cat demo1.py
➜ mygit git:(master)
git checktout HEAD .
或git checktout HEAD .
命令,会用 HEAD 指向的master分支中全部或部分文件替换暂存区及工作区的文件。
cat .gitignore # 忽略某些文件
git diff # 查看尚未暂存的文件更新了哪些部分
git diff --cached # 查看已暂存的文件与上次提交的快照之间的差异
git commit # 提交更新
git commit -a -m 'first initial' # 跳过使用暂存区域的方式,自动将已跟踪过的文件暂存起来一并提交
git rm -f a.test # 从git强制移除文件a.text
git rm --cached readme.txt
git restore --staged readme.txt