Git 是我们平时最常用的版本控制工具. 相比于 SVN,Git 有如下几大优势:(1)Git 是分布式管理, 不需要单独的服务器存储代码, 团队中的每一台机器都可以作为服务器, 都相互独立. 其最大的优点就是, 在断网的情况下, 仍然可以正常地使用 Git 来管理本地的提交等版本管理操作. 待网络恢复以后, 只需要把所有的提交 push 到远程 Git 服务器即可.(2)切换分支速度非常快, 几乎是瞬间完成, 对分支的管理方面效率比 SVN 更高, SVN 的分支切换太慢, 导致该功能形同虚设.
该篇文章中, 记录了平时使用时常用的命令, 其中绝大部分都是平时自己用过的命令. 在学习和使用工具时, 主要参考了如下两个网站:
- https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- https://Git-scm.com/book/zh/v2
一, 相关配置
1, 查看 Git 配置信息 $ Git config --list
2, 修改配置信息(平时使用时, 只修改过 user.name 和 user.email)
- $ Git config --global user.name "Your Name"
- $ Git config --global user.email "email@example.com"
3,$ Git init 把当前目录变成 Git 仓库
二, 本地 Git 操作
1,$ Git status 查看新修改文件状态
2,$ Git checkout filename 还原修改的文件(根据自己演示的结果, 得到的结论)
(1)当 unstage 区 (即只修改但未 add 时) 中有, 而 stage 区中没有该 filename 文件时, 该命令使 filename 文件还原为最新一次 commit 中的文件
(2)当 unstage 区中有, stage 区中也有时, 执行该命令后, unstage 区文件还原为 stage 中的内容
(3)当 unstage 区中没有, stage 区中有时, 执行该命令后, stage 区文件不变, 此时需要使用 $ Git reset HEAD filename 还原(后续会讲到该命令)
3,$ Git add 将工作区中新修改文件添加到 stage 区
filename 将指定文件添加到 stage 区
dir 将某个文件夹添加到 stage 区
. 在 Git Version2.x 中将当前文件夹下所有有改动 (修改的, 删除的, 新创建的文件) 的文件加入到 stage 区. 在 Git Version1.x 中只将新修改的和新创建的文件添加到 stage 区.
-u (update)将所有 tracked 文件添加到 stage 区中, 从测试情况来看, 删除的文件和新修改的文件都是 tracked, 新创建的文件是 untracked 文件, 用 Git status 可以查看(简单点说, 就是将删除的, 新修改的文件添加到 stage 区).
-A (all) 将所有 change(修改的, 删除的, 新创建的文件)都提交到 stage 区
--ignore-removal 新创建的文件和新修改的文件, 被添加到 stage 区. 忽略掉被删除的文件. 和 Git Version1.x 中 Git add . 功能一样.
-h 显示帮助信息
4,$ Git reset HEAD 可以将 stage 中的 change 还原到 unstage 区 (即 add 前的状态) 中, 详细的可以参考第 6 点.
5,$ Git commit
-a (--all) 将被 track 的文件, 提交. 包括没有被 add 的文件.
-m (--message) "message" 将 stage 区域的文件添加到当前分支中, 并带有 log
--amend 将弹出一个编辑页面, 编辑修改上一次 commit 的内容.
-C(--reuse-message) <commit> 使用和 commit-id 相同的提交信息(可以用于补充提交内容)
--reset-author 重新设置作者.
6,$ Git reset 将仓库提交指针指向某个版本(可能是前进, 也可能是回退)
--soft 指针移动后, 当前 change 仍不变.
--hard 指针移动后, 当前 change 被还原为未修改状态.
没有 hard/soft 时, stage 区中的 change 还原到 unstage 区.
commit-id,HEAD 指针指向到 commit-id 的提交点版本.
HEAD 表示当前版本 HEAD^ 表示上一个版本, 多个 ^ 可以共同使用, 读者可以自行查询.
7,$ Git revert commitId 将已经提交的 id 为 commitId 记录退回到提交前. 会产生一个新的 commitId, 注意和 reset 区别开来, reset 会删除掉对应的 commit 记录.
8,$ Git diff
file 添加文件名, 针对某个文件进行比较.
无参数 (1)如果 stage 区有, 则是工作区和 stage 去做比较
(2)如果 stage 区没有, 则是工作区和分支中做比较
HEAD 比较工作区和 HEAD 指针指向的版本库中文件做比较
--cache 暂存区和分支做比较.
9,$ Git rm
10,$ Git stash 隐藏所有 tacked(modified 和 deleted)的 change,stash 就是隐藏的意思. 无论是 unstage 区还是 stage 区的, 都可以被 stash 隐藏保存起来.
untracked 的文件不能被 stash(测试时发现的结果), 需要先 add 到 stage 区, 然后 stash. 还原重新使用后, tracked 文件 都会被转移到 add 前的状态.
(1)save <msg> 其中 <msg > 表示对当前隐藏的信息做一些注释说明, 可以不填写. 从测试结果上看, 不加 < msg > 时, Git stash 和 Git stash save 效果一样.
(2)list 显示当前所有被 stash 的信息
以上三条信息分别对应 stash 的保存(msg 信息被被截取了一部分):
stash@{0} -- $ Git stash save "test stash save"
stash@{1} -- $ Git stash save , 其中 ":" 后面的信息为 Git 自动添加, 表示当前版本库中最新提交的 commt-id 号简写和提交信息
stash@{2} -- $ Git stash
(3)pop 取出 stash 栈顶 (即 stash@{0}) 的信息, 并删除该条信息
(4)apply stash@{n} 指定使用哪一条 stash 记录, 但该记录不会受影响.
(5)drop stash stash@{n} 删除指定的 stash 记录, 该记录不会还原到工作区.
(6)clear 删除 stash 所有记录.
(7)恢复被删除后的 stash 记录
1)找到被删除的记录 id, 如第 (5) 点中的
查看之前被删除的记录: Git fsck --lost-found
2)根据 commit 的 id, 恢复修改记录
命令: Git merge commitId
通过上面的步骤, 被误删的 stash 记录就又回到代码中了, 但是如果要让这些修改回到 unstage 区, 需要再执行 Git reset HEAD^
10, 创建本地分支
(1)$ Git branch new-branch-name
(2) $ Git checkout -b new-branch-name 创建分支后, 当前分支会切换到新创建的分支.
11, 切换分支(注意与创建本地分支 -b 参数的差别)
$ Git checkout brance-name
12, 合并分支
$ Git merge branch-name
此时, master 分支中做的修改, 就被合并到了 test-branch 中来了.
13, 拉取远程分支内容
$ Git pull --rebase (一般建议是使用 --rebase, 这样可以使提交线更优雅, 可以到网上去查一下 Git pull, 和 Git pull --rebase 的区别)
14, 提交本地分支到远程分支
$ Git push origin branch-name
三, 远程分支:
1, 查看远程路径, 拉取版本代码的时候的路径 (根据权限的不同, fetch 和 push 不一定都显示)
$ Git remote -v
2, 查看远程分支
(1)$ Git branch 查看本地分支(* 为当前分支)
(2)$ Git branch -a 查看本地和远程所有分支 (-av 可以显示每条分支最新的一条提交记录)
3, 创建远程分支
创建一个本地分支 dev1, 然后 push 到远程 Git 服务器.
(1)$ Git push origin local-branch-name:remote-branch-name (: 前后没有空格, 本地分支和远程分支最好用同一个分支名, 便于识别)
(2)$ Git push origin dev (提交本地分支修改时, 也是该命令)
4, 删除远程分支(网上查资料, 删除的命令有多种, 使用过以下两种方式)
- (1)$ Git branch -r -d origin/branch-name
- (2)$ Git push origin :branch-name(有些时候有效, 有些时候无效, 尚未找到原因)
5, 重命名远程分支
网上查过一些资料, 一般都是说无法直接修改, 用间接的方式
(1)先删除远程分支
(2)重命名本地分支 $ Git branch -m branch-name new-branch-name
(3)将本地分支 push 到远程仓库
6, 查看某条远程分支的更新记录
$ Git reflog show --date=iso origin/master
7, 拉取远程分支并创建本地分支
(1)Git branch -r
查看远程分支名称
(2)Git checkout -b 本地分支名 远程分支名
创建并切换到本地分支了
四, log 的使用
1, 查看提交记录 $ Git log
-- filename 显示某个文件的提交信息
-n 显示 log 条数
-p 显示每次提交的 diff
--grep=str 根据关键字查找提交记录
2, 查看某次提交记录 diff 等信息 Git show commit-id
filename 查看某个文件在某次提交中的相关信息
3, 查看某个文件的提交记录
Git log --pretty==online filename 找到 commitid, 然后结合 commit show 来查看
4, 查看某个文件某处的提交记录
$ Git blame -L 行号,+ 列号 文件路径名称
当前命令表示查看 FaceIdSdk.java 文件 第 75 行, 第 5 列中的提交记录
五, 添加 Git 的忽略文件.
在项目开发中, 有些文件不希望提交到 Git 中, 可以创建. gitignore 文件, 将不需要 Git 识别的文件路径添加到其中, 并提交到 Git 中. 不需要从头写. gitignore 文件, GitHub 已经为我们准备了各种配置文件, 只需要组合一下就可以使用了. 所有配置文件可以直接在线浏览: https://GitHub.com/GitHub/gitignore
忽略文件的原则是:
(1)忽略操作系统自动生成的文件, 比如缩略图等;
(2)忽略编译生成的中间文件, 可执行文件等, 也就是如果一个文件是通过另一个文件自动生成的, 那自动生成的文件就没必要放进版本库, 比如 Java 编译产生的. class 文件;
(3)忽略你自己的带有敏感信息的配置文件, 比如存放口令的配置文件.
六, 别名配置
Git 中提供了使用别名来代替命令的的功能, 比如, Git status, 配置好别名 st 表示 status 后, 直接使用 Git st 即可. 对于一些常用, 但命令比较长, 而且不容易记忆的情况, 别名的使用带来了极大的便利.
按照这样的格式配置自己喜欢的别名即可. 配置后的别名是全局性的, 在所有 Git 仓库中都有效. 在配置文件中有对应的记录, 我的配置文件路径为: C:\Users\rd0489\.gitconfig
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
$ Git lg 运行效果
是不是非常丧心病狂? -_-
来源: https://www.cnblogs.com/andy-songwei/p/9737586.html