最近在极客时间购买了一份视频,学习 git,github,gitlab。
虽然用过 git 和 github,还是系统学习一下,毕竟是必备开发工具
常用 Git 命令
git 基本命令
基本配置
- 全局配置
1 | git config -global user.name '' |
- 本地配置
1 | git config -local user.name '' |
- 查看配置
1 | git config --list [--local|--global] |
初始化仓库
- 已存本地项目,在根路径下:
1 | git init |
- 初始化空仓库
1 | git init 仓库名 |
将 有变动的添加到暂存区
- 单个文件
1 | git add 文件名/文件夹名 |
- 所有有变动文件
1 | git add -u |
将变更提交
- 提交暂存区变更
1 | git commit -m "变更信息" |
- 未存入暂存区,直接提交
1 | git commit -am "变更信息" |
查看仓库状态
1 | git status |
已提交文件重命名的简便方法
1 | git mv readme readme.md |
日志
- 当前分支版本信息
1 | git log |
- 查看简洁版本历史信息
1 | git log --oneline |
- 查看最近几次提交版本
1 | git log -n (最近n次) |
- 查看所有分支版本信息
1 | git log --all |
- 查看图形化版本信息
1 | git log --graph |
- 多个命令组合
1 | //所有分支,最近三次提交,图形化信息 |
分支
- 查看当前分支信息
1 | git branch -v |
- 查看所有分支 名字
1 | git branch -a |
- 查看所有分支信息
1 | git branch -av |
- 基于原来的分支创建新分支并切换到该分支
1 | git checkout -b <新分支名> <旧分支名/commit Hash> |
- 切换分支
1 | git checkout <分支名> |
- 删除分支:
1 | git branch -d <分支名> |
- 强制删除
1 | git branch -D <分支名> |
Git 对象
commit -> tree(文件夹)->blob(具体文件)
- 查看 git 里面的对象的内容
1 | git cat-file -p <文件hash> |
- 查看 git 对象的类型
1 | git cat-file -t <文件hash> |
图形化查看 git 版本
- 当前分支
1 | gitk |
- 查看所有分支
1 | gitk all |
分离头指针
- 新提交的 commit 没有挂在任何分支上,会直接被 git 丢弃
- 建立新的分支保存分离头指针
1 | git branch <新分支名字> <commit的hash> |
差异
- 比较暂存和工作区的差异
1 | git diff |
- 两个 commit 的差异
1 | git diff commit1 commit2 |
- 不同分支的差异
1 | git diff branch1 branch2 |
- 不同分支/commit 的指定文件的差异
1 | git diff branch1/commit branch2/commit -- <filename> |
- 当前 HEAD(最近提交的 commit)和父级 commit 的差异
1 | git diff HEAD HEAD^ |
- 当前 HEAD 和父级的父级 commit 比较
1 | git diff HEAD HEAD^^/HEAD~2 |
- 比较暂存和当前 HEAD 的差异
1 | git diff --cached |
修改最近提交的一次 commit 的 message
1 | git commit --amend |
修改老旧 commit 的 message
1 | //交互式 |
- 根据提示信息选择不同命令 ,除了命令不修改其他信息。
然后保存退出,弹出新的交互窗口,改变 commit 的 message
1.pick:仅使用该 commit
2.reword:修改 commit 的 message 信息
3.edit:修改 commit
4.squash:合并 commit将几个连续的 commit 合并到一个 commit 上
将几个不连续的 commit 合并到一个 commit 上
顶级 commit 无父级 commit,就 rebase 当前 commit,并将 commit 添加到
恢复
- 将暂存区的文件全部恢复成当前 HEAD(删除暂存区所有文件)
1 | git reset HEAD //此时执行git diff --cached不返回任何内容 |
- 将暂存区和工作区恢复成 HEAD
1 | git reset --hard HEAD //暂存区被清空 |
- 将暂存区某个或几个的文件恢复当前 HEAD
1 | gut reset HEAD -- <file1> <file2> |
- 将暂存区和工作区恢复成某个历史状态
1 | git reset --hard <hash> |
删除文件
- 删除文件并保存状态到暂存区
1 | git rm <filename> |
开发时加塞紧急任务
- 存入 stash,不存入暂存区
1 | git stash |
- 恢复最近的 stash
1 | git stash apply //不会删除stash的记录 |
- 恢复某个 stash
1 | git stash apply stash@{2}//默认是git stash apply stash@{0} |
- .gitignore
忽略不需要提交的文件
github 新建项目时,可以根据不同语言的项目匹配不同的.gitignore 文件
- doc 忽略所有名字为 doc 文件和文件夹
- doc/ 忽略名字为 doc 的文件夹,不忽略文件
- doc
!doc/ 忽略名字为 doc 的文件, 不忽略文件夹 忽略已经提交的文件
把要忽略的文件名 添加到.gitignore,
删掉仓库里要忽略的文件1
git rm -- cached <name>
git 备份
- 四种传输协议
- 哑协议:/path/to/repo.git (传输进度不可见)
- 智能协议:file:///path/to/repo.git(传输进度可见,比哑协议快)
- http/https 协议:http://git-server.com:port/path/to/repo.git
https://git-server.com:port/path/to/repo.git - ssh 协议:user@git-server.com:path/to/repo.git
- 从远端仓库克隆项目到本地
1 | git clone --bare <server-path> <local-name> //--bare仅克隆git,不带工作区的仓库 |
将本地项目同步到远端仓库
- 查看有无远端仓库连接
1
git remote -v
- 建立与远端的联系
1
git remote add <server-file-name> <server-path> //用名字指代地址
删除已存在的 remote1
git remote remove <name>
- 提交变更
1
2
3git push <server-file-name>
//当前分支没有与远程分支关联
git push --set-upstream <server-file-name> <branch-name>
获取远端的其他人提交的变更
1
2git fetch <server-file-name>
//<server-file-name>给定拉取哪个远端的数据合并分支到当前分支
1
git merge <branch>/hash
从远端拉去代码并合并
1
git pull
提交代码非 fast forward,变基操作
在 master 新建分支上要提交的多个 commit- 切换到需要变基的分支:git rebase origin/master
变基为 master 分支 - 提示冲突,根据提示文件解决冲突
- 变更文件加入暂存区 git add .
- git rebase –continue
- 提示冲突,根据提示文件解决冲突
- 。。。
- git push origin Shanghai //非 fast forword
- git push -f origin Shanghai
- 继续执行 pull request
- 切换到需要变基的分支:git rebase origin/master
rebse 多次解决冲突,其他的解决办法
- 解决一次冲突,记录冲突
- 配置项 git config –global rerere.enabled true
- 将要提交的分支和 master 分支 merge 一下
- 解决冲突,然后 git add,记录一下
- 再将分支退回到前一个 commit, git reset –hard HEAD~1
- git rebase origin/master
- git rebase –continue
- 虽然提示冲突,但是已经解决好了
- 将解决完冲突的文件放入暂存区 git add .
- git rebase –continue
- 。。。。
- git push -f origin Shanghai
将本地仓库同步到 Github
- 注册 Github
- 新建仓库
- 建立本地仓库与远端的联系,git remote
1 | git remote add github https://github.com/Dorisfeng/git_learning.git |
采用 ssh(git@github.com:Dorisfeng/git_learning.git)建立连接,push 时报错:
1 | git@github.com: Permission denied (publickey). |
解决办法
就是本地的 ssh 失效
- 根目录 :cd ~
- 打开.ssh: open .ssh(没有就新建)
- 将三个文件备份删除
- 新建 ssh:ssh-keygen -t rsa -C “871609506@qq.com“
- 在 github 设置里面新建 ssh,将 id_rsa.pub 里面的内容复制粘贴到 key 里面
- 测试连接是否成功:ssh -T -v git@github.com
Hi Dorisfeng! You’ve successfully authenticated, but GitHub does not provide shell access.
表示连接成功
提交,git push
1
git push github --all
红色错误是 github 新建仓库时,在已经新建分支 master 存放了 license,本地分支 master 无法提交
拉取远端分支
1 | git fetch <server-name> |
将本地仓库中的 master 分支与远端分支合并 git merge
1
2
3git merge github1/master
//fatal: refusing to merge unrelated histories 没有关系的树,无法合并,根据git merge -h查看参数是否可以合并无关系 的树
git merge --allow-unrelated-histories github1/master
提交 master 分支
1
git push github1 master
github 一个 bug,如果 github 注册邮箱和本地配置的 git 的 user.email 一 致将不会 commit 将不会显示本地配置的 user.name,而是显示 github 的头像和名字
同时修改了同一文件的不同内容
直接使用 git pull 拉取并自动合并冲突,git 会自动保留两部分修改内容同时修改了同一文件名
使用 git pull 拉取,git 会同时保留两个文件,并且两个文件完全相同,diff 不出内容。
使用 git status 的提示,通过同事间沟通保留文件名字
mac 终端命令
清空屏幕
1 | clear |
当前文件路径
1 | pwd |
拷贝文件
1 | cp 文件相对路径 存放的相对路径 |
*改变当前目录
1 | cd dirname进入下一层一路径 |
拷贝文件夹
1 | cp -r <文件夹相对路径> <存放的相对路径> |
创建文件夹
1 | mkdir name |
删除文件夹
1 | rmkdir name |
移动或重命名一个目录
1 | mvdir dir1 dir2 |
在命令行里打开当前文件
1 | vi name |
- 编辑使用 vi 打开的文件 ,输入 i-变成可编辑状态
- vi 编辑状态回到命令行:按 esc 取消编辑 然后
- :w 保存文件但不退出 vi
- :w file 将修改另外保存到 file 中,不退出 vi
- :w! 强制保存,不推出 vi
- :wq 保存文件并退出 vi
- :wq! 强制保存文件,并退出 vi
- q: 不保存文件,退出 vi
- :q! 不保存文件,强制退出 vi
- :e! 放弃所有修改,从上次保存文件开始再编辑
显示当前目录内容
1 | ls -la |
改变文件名或移动文件
1 | mv name1 name2 //将name1重命名为name2 |
创建文件和内容
1 | echo 'hello world' >readme |
查看.git/objects 文件夹里面的类型为文件的文件
1 | find .git/objects -type f/file |
将普通文件内容打印到屏幕上
1 | cat+文件名 |