1. 本地创建版本库
mkdir note
cd note
git init # 初始化git。 note目录下回多一个.git的隐藏目录。.git目录用来存放git版本控制的元数据,用以追踪文件的变化,不要动,否则会发生意想不到的后果。
touch readme.md # 创建readme.md文件。输入几行内容:如:my learning note\n Linux \n git \n MySQL
$ cat -n readme.md # 查看readme.md文件的内容
1 my learning note
2 Linux
3 git
4 MySQL
wt@wt MINGW64 ~/Desktop/note (master)
$ ls # 查看当前目录下的文件
git/ Linux/ MySQL/ readme.md
$ git add readme.md # 把readme.md添加到暂存区(以追踪文件的变化)
warning: LF will be replaced by CRLF in readme.md.
The file will have its original line endings in your working directory.
$ git commit -m '提交test' # 把暂存区内所有被追踪的内容(被add添加过的)提交到本地仓库
[master 58577a4] 提交test1
1 file changed, 3 insertions(+)
$ vi readme.md # 用vi编辑器打开readme.md文件,给文件添加一行汉字
$ cat -n readme.md # 查看文件
1 my learning note
2 Linux
3 git
4 MySQL
5 添加汉字!
wt@wt MINGW64 ~/Desktop/note (master)
$ git status # git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.md被修改过了,但还没有准备提交的修改。
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: readme.md # 显示修改的文件
Untracked files:
(use "git add <file>..." to include in what will be committed)
Linux/
MySQL/
git/
no changes added to commit (use "git add" and/or "git commit -a")
$ git diff readme.md # 查看文件变化
diff --git a/readme.md b/readme.md
index 01e4ef8..047b0de 100644
--- a/readme.md # 同一个文件的a,b两种不同的状态
+++ b/readme.md
@@ -2,6 +2,4 @@ my learning note
Linux
git
MySQL
-
-add one line here;
添加汉字!
warning: LF will be replaced by CRLF in readme.md.
The file will have its original line endings in your working directory.
$ 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: readme.md
Untracked files: # 未追踪的文件,因为我们还没有git add 这些文件
(use "git add <file>..." to include in what will be committed)
Linux/
MySQL/
git/
no changes added to commit (use "git add" and/or "git commit -a")
git add . # 把当前目录下所有目录及文件添加到暂存区以追踪。相对于 git add -A或者git add ./*
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: "Linux/2018-5-6 Linux\350\246\201\345\246\202\344\275\225\345\255\246\344\271\240 160224.md" # 这些是中文乱码,下面有解决这个问题的方法。
new file: Linux/Note3.md
new file: Linux/Note4.md
new file: Linux/note1.md
new file: Linux/note2.md
new file: MySQL/Note1.md
new file: "git/git\346\223\215\344\275\234.eddx" # 中文乱码
new file: "git/git\346\223\215\344\275\234.png" # 中文乱码
new file: git/note.md
new file: "git/\347\211\210\346\234\254\346\216\247\345\210\266.xmind" # 中文乱码
modified: readme.md
wt@wt MINGW64 ~/Desktop/note (master)
$
中文乱码的解决办法:
在git命令行输入git config --global core.quotepath false
就可以了
core.quotepath设为false的话,就不会对0x80以上的字符进行quote。中文显示正常
2. git add
的参数
rock@wtgg:~$ git add -h # 关于添加的参数
用法:git add [<选项>] [--] <路径规格>...
-n, --dry-run 演习
-v, --verbose 冗长输出
-i, --interactive 交互式拣选
-p, --patch 交互式挑选数据块
-e, --edit 编辑当前差异并应用
-f, --force 允许添加忽略的文件
-u, --update 更新已跟踪的文件
--renormalize 对已跟踪文件(暗含 -u)重新归一换行符
-N, --intent-to-add 只记录,该路径稍后再添加
-A, --all 添加所有改变的已跟踪文件和未跟踪文件
--ignore-removal 忽略工作区中移除的路径(和 --no-all 相同)
--refresh 不添加,只刷新索引
--ignore-errors 跳过因出错不能添加的文件
--ignore-missing 检查在演习模式下文件(即使不存在)是否被忽略
--chmod <(+/-)x> 覆盖列表里文件的可执行位
rock@wtgg:~$
3. git commit
的参数
git commit -m
用于提交暂存区的文件;git commit -am
用于提交跟踪过的文件
rock@wtgg:~$ git commit -h
用法:git commit [<选项>] [--] <路径规格>...
-q, --quiet 提交成功后不显示概述信息
-v, --verbose 在提交说明模板里显示差异
提交说明选项
-F, --file <文件> 从文件中读取提交说明
--author <作者> 提交时覆盖作者
--date <日期> 提交时覆盖日期
-m, --message <说明> 提交说明
-c, --reedit-message <提交>
重用并编辑指定提交的提交说明
-C, --reuse-message <提交>
重用指定提交的提交说明
--fixup <提交> 使用 autosquash 格式的提交说明用以修正指定的提交
--squash <提交> 使用 autosquash 格式的提交说明用以压缩至指定的提交
--reset-author 现在将该提交的作者改为我(和 -C/-c/--amend 参数共用)
-s, --signoff 添加 Signed-off-by: 签名
-t, --template <文件>
使用指定的模板文件
-e, --edit 强制编辑提交
--cleanup <default> 设置如何删除提交说明里的空格和#注释
--status 在提交说明模板里包含状态信息
-S, --gpg-sign[=<key-id>]
GPG 提交签名
提交内容选项
-a, --all 提交所有改动的文件 # 前提是此文件被追踪
-i, --include 添加指定的文件到索引区等待提交
--interactive 交互式添加文件
-p, --patch 交互式添加变更
-o, --only 只提交指定的文件
-n, --no-verify 绕过 pre-commit 和 commit-msg 钩子
--dry-run 显示将要提交的内容
--short 以简洁的格式显示状态
--branch 显示分支信息
--ahead-behind 计算完整的领先/落后值
--porcelain 机器可读的输出
--long 以长格式显示状态(默认)
-z, --null 条目以 NUL 字符结尾
--amend 修改先前的提交
--no-post-rewrite 绕过 post-rewrite 钩子
-u, --untracked-files[=<模式>]
显示未跟踪的文件,“模式”的可选参数:all、normal、no。(默认:all)
rock@wtgg:~$
4. git branch
(分支)的参数
git checkout -b feature-x develop
本地从develop分支上创建一个feature-x分支,并切换到该分支上
它相当于这2条命令的合并:
git branch feature-x develop
git checkout feature-x
git checkout develop
# 切换回develop 分支
git merge --no-ff feature-x
合并feature-x分支,加上--no-ff
参数会保留版本演进路线,否则默认会执行"快进式合并"(fast-farward merge),会直接将feature-x分支指向Develop分支。
git branch -d feature-x
# 本地删除feature-x分支-d
是删除,如果该分支还没有被合并,会删除提示删除失败,-D
是强制删除。
git push origin -d <BranchName>
# 删除远程分支
或者git push origin(远程仓库名,不一定是origin) :远程分支名
# 注意origin
和:远程分支
之间有一个空格,这里原本应该是写本地分支,现在留空,即把一个空的分支推送到远程的某个分支,相当于把远程的这个分支删除!
git branch -r
列出所有的远程分支
git branch -a
列出所有本地和远程分支
git remote -v
列出远程仓库的信息
例如
λ git remote -v # 本项目关联了github和码云2个远程仓库。2个远程仓库的名字都不是origin,分别是gitee和github
gitee https://gitee.com/wtgg/my_spiders.git (fetch)
gitee https://gitee.com/wtgg/my_spiders.git (push)
github https://github.com/wtgg/my_spiders.git (fetch)
github https://github.com/wtgg/my_spiders.git (push)
rock@wtgg:~$ git branch -h
用法:git branch [<选项>] [-r | -a] [--merged | --no-merged]
或:git branch [<选项>] [-l] [-f] <分支名> [<起始点>]
或:git branch [<选项>] [-r] (-d | -D) <分支名>...
或:git branch [<选项>] (-m | -M) [<旧分支>] <新分支>
或:git branch [<选项>] (-c | -C) [<老分支>] <新分支>
或:git branch [<选项>] [-r | -a] [--points-at]
或:git branch [<选项>] [-r | -a] [--format]
通用选项
-v, --verbose 显示哈希值和主题,若参数出现两次则显示上游分支
-q, --quiet 不显示信息
-t, --track 设置跟踪模式(参见 git-pull(1))
-u, --set-upstream-to <上游>
改变上游信息
--unset-upstream 取消上游信息的设置
--color[=<何时>] 使用彩色输出
-r, --remotes 作用于远程跟踪分支
--contains <提交> 只打印包含该提交的分支
--no-contains <提交> 只打印不包含该提交的分支
--abbrev[=<n>] 用 <n> 位数字显示 SHA-1 哈希值
具体的 git-branch 动作:
-a, --all 列出远程跟踪及本地分支
-d, --delete 删除完全合并的分支
-D 删除分支(即使没有合并)
-m, --move 移动/重命名一个分支,以及它的引用日志
-M 移动/重命名一个分支,即使目标已存在
-c, --copy 拷贝一个分支和它的引用日志
-C 拷贝一个分支,即使目标已存在
--list 列出分支名
-l, --create-reflog 创建分支的引用日志
--edit-description 标记分支的描述
-f, --force 强制创建、移动/重命名、删除
--merged <提交> 只打印已经合并的分支
--no-merged <提交> 只打印尚未合并的分支
--column[=<风格>] 以列的方式显示分支
--sort <key> 排序的字段名
--points-at <对象> 只打印指向该对象的分支
-i, --ignore-case 排序和过滤属于大小写不敏感
--format <格式> 输出格式
rock@wtgg:~$
5. git merge
(合并)的参数
rock@wtgg:~$ git merge -h
用法:git merge [<选项>] [<提交>...]
或:git merge --abort
或:git merge --continue
-n 在合并的最后不显示差异统计
--stat 在合并的最后显示差异统计
--summary (和 --stat 同义)
--log[=<n>] 在合并提交信息中添加(最多 <n> 条)精简提交记录
--squash 创建一个单独的提交而不是做一次合并
--commit 如果合并成功,执行一次提交(默认)
-e, --edit 在提交前编辑提交说明
--ff 允许快进(默认)
--ff-only 如果不能快进就放弃合并
--rerere-autoupdate 如果可能,重用冲突解决更新索引
--verify-signatures 验证指定的提交是否包含一个有效的 GPG 签名
-s, --strategy <策略>
要使用的合并策略
-X, --strategy-option <option=value>
所选的合并策略的选项
-m, --message <说明> 合并的提交说明(针对非快进式合并)
-v, --verbose 更加详细
-q, --quiet 更加安静
--abort 放弃当前正在进行的合并
--continue 继续当前正在进行的合并
--allow-unrelated-histories
允许合并不相关的历史
--progress 强制显示进度报告
-S, --gpg-sign[=<key-id>]
GPG 提交签名
--overwrite-ignore 更新忽略的文件(默认)
--signoff 添加 Signed-off-by: 签名
--verify 校验 commit-msg 钩子
rock@wtgg:~$
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
6. git push 推送
先在Github 或者coding.net 或者码云 上面新建代码仓库,复制仓库的ssh或者https地址
$ git remote add origin git@git.coding.net:xxx/xxx.git
关联远程仓库
$ git push -u origin master
第一次推送时 加上-u
参数。
以后每次git push origin 本地仓库:远程仓库
就可以推送了。
如果本地仓库和远程仓库同名。可以简化为:git push origin 仓库名
其中 origin是远程仓库的代称,也可以是别的名字,比如
git remote add github https://github.com/wtgg/my_spiders.git
# 关联我github上的my_spiders项目仓库,远程仓库取名github,而不是origin,
git remote add gitee https://gitee.com/wtgg/my_spiders.git
# 关联我码云上的my_spiders项目仓库,远程仓库取名为gitee。同一个项目关联2个远程仓库,所以2个远程仓库取了不同的名字。
推送的时候
git push github master
# 把项目推送到github的master分支
git push gitee master
# 把项目推送到码云的master分支
如果要推送分支:
git push github dev:dev
# 推送本地的dev分支到github的dev分支
git push gitee dev:dev
# 推送本地的dev分支到码云的dev分支
git pull origin <远程分支>:<本地分支>
git push origin <本地分支>:<远程分支>
rock@wtgg:~$ git push -h
用法:git push [<选项>] [<仓库> [<引用规格>...]]
-v, --verbose 更加详细
-q, --quiet 更加安静
--repo <仓库> 仓库
--all 推送所有引用
--mirror 镜像所有引用
-d, --delete 删除引用
--tags 推送标签(不能使用 --all or --mirror)
-n, --dry-run 演习
--porcelain 机器可读的输出
-f, --force 强制更新
--force-with-lease[=<引用名>:<期望值>]
要求引用旧的取值为设定值
--recurse-submodules[=<check|on-demand|no>]
控制子模组的递归推送
--thin 使用精简打包
--receive-pack <receive-pack>
接收包程序
--exec <receive-pack>
接收包程序
-u, --set-upstream 设置 git pull/status 的上游
--progress 强制显示进度报告
--prune 清除本地删除的引用
--no-verify 绕过 pre-push 钩子
--follow-tags 推送缺失但有关的标签
--signed[=<yes|no|if-asked>]
用 GPG 为推送签名
--atomic 需要远端支持原子事务
-o, --push-option <server-specific>
传输选项
-4, --ipv4 只使用 IPv4 地址
-6, --ipv6 只使用 IPv6 地址
7. git log
参数
rock@wtgg:~$ git log -h
用法:git log [<选项>] [<版本范围>] [[--] <路径>...]
或:git show [<选项>] <对象>...
-q, --quiet 不显示差异输出
--source 显示源
--use-mailmap 使用邮件映射文件
--decorate-refs <模式>
只修饰与 <模式> 匹配的引用
--decorate-refs-exclude <模式>
不修饰和 <模式> 匹配的引用
--decorate[=...] 修饰选项
-L <n,m:file> 处理文件中第 n 到 m 之间的行,从 1 开始
rock@wtgg:~$
$ git log --pretty=oneline;
以简明的信息显示版本号(40位16进制数字) 和 对应的提交信息,便于版本恢复。这个命令会显示所有项目成员与远程仓库同步的提交信息。
$ git reflog
显示当前用户每此的版本号(即commit id
)与对应的提交信息,不过这里的版本号只显示前几位,也能用于恢复版本
8. git reset --hard 版本号
版本回退
rock@wtgg:~/PycharmProjects/abc$ git reset -h
用法:git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<提交>]
或:git reset [-q] [<树或提交>] [--] <路径>...
或:git reset --patch [<树或提交>] [--] [<路径>...]
-q, --quiet 安静模式,只报告错误
--mixed 重置 HEAD 和索引
--soft 只重置 HEAD
--hard 重置 HEAD、索引和工作区
--merge 重置 HEAD、索引和工作区
--keep 重置 HEAD 但保存本地变更
--recurse-submodules[=<reset>]
control recursive updating of submodules
-p, --patch 交互式挑选数据块
-N, --intent-to-add 将删除的路径标记为稍后添加
9. 其他
$ git remote -v
origin git@git.coding.net:wtgg/note.git (fetch)
origin git@git.coding.net:wtgg/note.git (push)
如果本地显示推送成功,但是在网页看不到更新。有可能是推送到别的地址上了。(有时候打开好几个仓库,复制粘贴了错的远端地址)
网友评论