版本控制 | Git
一、Git 下载与配置
1.1 下载地址:
Windows: https://git-scm.com/download/win
Mac: https://git-scm.com/download/mac
Linux/Unix: https://git-scm.com/download/linux
1.2 配置
/*配置 user.name 和 user.email*/ $ git config --global user.name ‘your_name’ $ git config --global user.email ‘’ $ git config --local user.name ‘your_name’ # local 只对某个仓库有效 $ git config --global user.name ‘your_name’ # global 对当前用户所有仓库有效 $ git config --system user.name ‘your_name’ # system 对系统所有登录的用户有效 优先级排序:local > global
/*查看配置信息*/ $ git config --list --local $ git config --list --global $ git config --list --system
二、建立 git 仓库
2.1 建立本地 git 仓库
$ cd 项目目录 $ git init # 在当前目录下增加一个 .git 目录。 $ git init <directory> # 指定目录创建空的 git 仓库,创建一个名为 directory,只包含 .git 子目录的空目录。
2.2 从远端 git 仓库拉取
$ git clone <repo> # 位于 <repo> 的仓库克隆到本地。 $ git clone <repo> <directory> # 位于 <repo> 的仓库克隆到本地。
2.3 git 传输协议:
* 本地协议:/path/to/repo.git 与 file:///path/to/repo.git。 * http/https 协议:网络协议。 * ssh 协议:常用的智能协议,需要公私钥。 * 哑协议: 哑协议传输进度不可见,只能协议传输可见。 * 智能协议:智能协议比哑协议传输速度快。 $ git clone --bare /path/.git git_name.git (哑协议) $ git clone --bare file:///path/.git git_name.git (智能协议)
三、提交 commit
git 提交流程:当前项目 -> git add -> 暂存区 -> git commit -> Git仓库
$ git status # 查看 git 当前状态。 $ git add files # 添加文件到暂存区。 $ git add -u # -u 是 update 的意思,保存修改和删除,不包括新建文件。 $ git add -A # -u 是 all 的意思,将文件的修改,文件的删除,添加到暂存区。 $ git add . # 保存新的添加和修改,但是不包括删除。 $ git commit -m ‘Add Info’ # 提交暂存区信息到 git 仓库。 $ git commit --amend # 对最近一次提交的 message 进行变更。 $ git push # 将提交的更改发送到远端仓库。 $ git push origin master # 将本地的 master 分支推送到 origin 主机的 master 分支。
四、分支操作
$ git checkout # 检出文件、检出提交、检出分支(检出提交会使工作目录和这个提交完全匹配。) $ git checkout master # 回到 master 分支 $ git checkout commit_id file # 查看某个分支下的 file 文件 $ git checkout -b dev # 创建并切换分支 $ git branch # 查看本地分支 $ git branch -r # 查看远程分支 $ git branch -a # 查看本地和远程分支 $ git branch -d branchName # 删除本地分支 $ git branch -d -r branchName # 删除远程分支 $ git branch -D branchName # 强制删除 branchName 分支 $ git branch -v # 查看本地分支信息 $ git branch -vv # 查看更多本地分支信息 $ git branch -av # 查看所有分支信息 $ git branch -m oldbranch newbranch # 重命名分支 $ git branch -M oldbranch newbranch # 强制重命名分支
五、查看 git 版本状态
commit 32d61abce038708176d1e0e409d1c2575a12f8fb ( 提交内容 SHA-1 校验总和 checksum ) Author: xxx <> Date: Tue Jan 7 18:27:24 2020 +0800 $ git log # 查看 git 上传管理日志 git 的版本历史。(当前分支) $ git log -all # 查看 git 上传管理日志 git 的版本历史。(所有分支) $ git log —-stat # 查看哪些文件被更改了,以及每个文件相对的增删行数。 $ git log -p # 显示每个提交全部的差异(diff)。 $ git log --oneline # 让提交记录在一行展示(展示一行)。 $ git log --oneline —all # 让提交记录在一行展示(展示所有)。 $ git log --oneline --all -n4 # 让提交记录在一行展示(展示所有分支最近的 4 条记录)。 $ git log --oneline --all -graph # 让提交记录在一行展示, 展示方式为图表的方式。 $ git log --author=“<pattern>” # 查看指定作者的提交
六、设置不需要 git 管理的文件夹
配置 .gitignore 文件(文件名必须为 .gitignore) folder/ *fiels ...
七、多人协作
$ git remote # 允许你创建,查看和删除与其他仓库之间的连。列出你和其他仓库之间的连接 $ git remote -v # 列出你和其他仓库之间的连接并显示每个连接的 url。 $ git remote add <name> <url> # 创建一个新的远程仓库连接,添加之后,可将<name> 作为 <url> 便捷的别名在其他 git 命令中使用。 $ git remote rm <name> # 移出别名为 name 的远程仓库连接。 $ git remote rename <old-name> <new-name> # 移出别名为 name 的远程仓库连接。 $ git fetch <remote> # 将提交从远程仓库导入到你的本地仓库。 $ git pull <remote> # 相当于 git fetch + git merge。 $ git pull —rebase <remote> # git rebase 合并远程分支和本地分支,不是 git merge。 $ git push # 将本地仓库中的提交转移到远程仓库中时要做的事。 $ git push <remote> <branch> # 将指定的分支推送到 <remote> 。
临时修复 $ git stash # 将当前工作区临时存储。 $ git stash list # 查看临时存储。 $ git stash apply # 恢复临时存储到工作区,不删除 stash list 保留信息。 $ git stash pop # 恢复临时存储到工作区,删除 stash list 保留信息。
回滚错误修改 $ git revert # 用来撤销一个已经提交的快照。(本地已修改代码会删除) $ git rebase # 变基操作(将当前分支 rebase 到 <base> )
举例:正在 A 分支下开发, master 发现了个错误需要修改 $ git checkout -b bugfix master # 基于 master 分支创建一个快速修复分支 $ git commit -a -m ‘Fix bug’ # 提交所有修改的分支。 $ git checkout master # 合并回到 master $ git merge bugfix # 合并修复的 bug $ git branch -d bugfix # 删除 bug 修复分支 $ git checkout A # 回到 A 分支 $ git rebase master # 将 A 分支指向 master 分支的末端
八、常用命令
变更 message $ git commit —amend # 变更最近一次的 commit message 信息。 $ git rebase -i super_commit_id # 变更指定的 commit, super_commit_id(父亲 commit), 变基操作团队开发时要注意,变更后 commit_id 会依次更改。
整理 commit $ git rebase -i super_commit_id # squash 命令 合并分支。(合并连续的commit) $ git rebase -i super_commit_id # s 命令拼接commit (修改 pick 顺序,将待合并的放到一起) # pick commit_1 # s commit_2
比较文件差异 $ git diff e1506a e1506a # 比较两个分支间的不同。 $ git diff HEAD HEAD^1 # 比较 HEAD 与 HEAD 的父亲。 $ git add files $ git diff --cached # 比较暂存区与 HEAD 文件之间的差异。 $ git diff # 比较工作区与暂存区之间的差异。 $ git diff branch_a branch_a files # 比较不同分支下的相同文件之间的差异。
暂存区操作 ( reset ) $ git reset HEAD # 取消暂存区所有文件 >> 保留工作区->取消暂存区。 $ git reset HEAD -- files # 取消暂存区制定文件 >> 保留工作区->取消暂存区。 $ git reset --hard commit_id # 删除指定的提交 commit
文件操作 $ git rm files # 删除指定文件 = rm files + git rm files。 $ git mv file newfile # 重命名 git 暂存区与 git 仓库中的文件信息。
图形化界面 $ gitk # 通过图形化界面查看 git
九、分离头指针(detached HEAD)
当前正工作在没有分支的情况下。
(当你切换到 master 分支上处理事情的时候,在没有分支的状态下编写的变更,分离头指针上面的变更可能会被清除掉。)
$git log commit e1506a04abbee1b5545bedcdca8b40f7d628d545 (HEAD -> master) # 指向 master 的分支。
十、git 目录
.git % ls COMMIT_EDITMSG config gitk.cache index logs refs HEAD description hooks info objects .git % ls -al total 48 drwxr-xr-x 13 xx staff 416 1 4 11:04 . 7 xx staff 224 1 4 10:40 .. -rw-r--r-- 1 xx staff 5 1 4 10:40 COMMIT_EDITMSG -rw-r--r-- 1 xx staff 23 1 4 09:56 HEAD // 本地目录的引用。 -rw-r--r-- 1 xx staff 137 1 4 09:56 config // 本地配置信息 -rw-r--r-- 1 xx staff 73 1 4 09:56 description -rw-r--r-- 1 xx staff 129 1 4 11:04 gitk.cache drwxr-xr-x 14 xx staff 448 1 4 09:56 hooks -rw-r--r-- 1 xx staff 270 1 4 10:40 index drwxr-xr-x 3 xx staff 96 1 4 09:56 info drwxr-xr-x 4 xx staff 128 1 4 09:57 logs drwxr-xr-x 11 xx staff 352 1 4 10:40 objects // 核心 commit,tree,blob drwxr-xr-x 4 xx staff 128 1 4 09:56 refs // 分支,tag 信息
git 对象 commit,tree,blob,三者之间的关系:
- git 中文件的存储 blob 不是由文件名存储的,是按文件的内容存储的,文件内容相同,在 git 中就代表相同的东西。
- 查看文件信息命令:$ git cat-file -p commit_id
- commit
- tree
- blob
- blob
- parent
- tree
- blob
- author
- committer
- tree
- author
- committer
测试 git 中文件结构为 /doc/README.md,README.md 内容为 hello, world 时:
当执行了 git add files 和 git commit 时 objects 目录中发生了什么
- tree
1、git add files
% find objects -type f objects/4b/5fa63702dd96796042e92787f464e28f09f17d % git cat-file -t 4b5fa63702 blob 目标文件中创建了blob,blob 的信息为:hello, world
2、git commit
% find .git/objects -type f .git/objects/3c/4fde2ab9b012a02b1d2c67bb66c0b7339e1fbc (tree / doc) .git/objects/4b/5fa63702dd96796042e92787f464e28f09f17d (blob / data) .git/objects/96/4acce37de78ac2e818af6ee7b46a85ba65883b (commit / 提交请求) .git/objects/46/fa040ce9c80920d335d5b0c654f33e6ee3431b (tree / README.md) % git cat-file -t 3c4fde2a % tree % git cat-file -p 3c4fde2a % 040000 tree 46fa040ce9c80920d335d5b0c654f33e6ee3431b doc % git cat-file -t 4b5fa637 % blob % git cat-file -p 4b5fa637 % hello, world % git cat-file -t 964acce3 % commit % git cat-file -p 964acce3 % tree 3c4fde2ab9b012a02b1d2c67bb66c0b7339e1fbc author kong <> 1578211573 +0800 committer kong <> 1578211573 +0800 CREATE FILE % git cat-file -t 46fa040c % tree % git cat-file -p 46fa040c % 100644 blob 4b5fa63702dd96796042e92787f464e28f09f17d README.md
Reference From:
https://git-scm.com/docs
https://github.com/geeeeeeeeek/git-recipes/wiki
相关推荐
Equation 2020-08-09
iamjiyu 2020-07-21
baolen 2020-08-15
87447007 2020-07-19
ArkShen 2020-07-05
formula 2020-11-12
huhongfei 2020-11-05
乾坤一碼農 2020-10-27
liumengyanysu 2020-10-22
E哥的aws认证攻略 2020-10-15
tianyafengxin 2020-10-08
guying 2020-10-05
好脑筋不如烂笔头 2020-09-17
nebulali 2020-09-11
佛系程序员J 2020-09-15
fenggit 2020-09-15
JustHaveTry 2020-09-11