Fork me on GitHub

Git-学习

最近在极客时间购买了一份视频,学习 git,github,gitlab。
虽然用过 git 和 github,还是系统学习一下,毕竟是必备开发工具

常用 Git 命令

常用命令

git 基本命令

基本配置

  • 全局配置
1
2
git config -global user.name ''
git config -global user.email ''
  • 本地配置
1
2
git config -local user.name ''
git config -local user.email ''
  • 查看配置
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
2
//所有分支,最近三次提交,图形化信息
git log --all -3 --graph

分支

  • 查看当前分支信息
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
2
//交互式
git rebase -i <父级commit的hash>
  • 根据提示信息选择不同命令 ,除了命令不修改其他信息。
  • 然后保存退出,弹出新的交互窗口,改变 commit 的 message
     1.pick:仅使用该 commit
    2.reword:修改 commit 的 message 信息
    3.edit:修改 commit
    4.squash:合并 commit

  • 将几个连续的 commit 合并到一个 commit 上
    要合并的commit
    修改合并后的meaasge

  • 将几个不连续的 commit 合并到一个 commit 上
    顶级 commit 无父级 commit,就 rebase 当前 commit,并将 commit 添加到
    顶级commit
    要合并的commit放到一起
    提示信息执行--continue
    修改合并后的message756

恢复

  • 将暂存区的文件全部恢复成当前 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
2
git stash
git stash list //查看所有的stash
  • 恢复最近的 stash
1
2
git stash apply //不会删除stash的记录
git stash pop //删除stash的记录
  • 恢复某个 stash
1
2
git stash apply stash@{2}//默认是git stash apply stash@{0}
git stash pop stash@{2}//默认是git stash pop stash@{0}
  • .gitignore
    忽略不需要提交的文件
    github 新建项目时,可以根据不同语言的项目匹配不同的.gitignore 文件
    gi
thub
  1. doc 忽略所有名字为 doc 文件和文件夹
  2. doc/ 忽略名字为 doc 的文件夹,不忽略文件
  3. doc
    !doc/ 忽略名字为 doc 的文件, 不忽略文件夹
  4. 忽略已经提交的文件
    把要忽略的文件名  添加到.gitignore,
    删掉仓库里要忽略的文件

    1
    git rm -- cached <name>

git 备份

  1. 四种传输协议
  2. 从远端仓库克隆项目到本地
1
git clone --bare <server-path> <local-name> //--bare仅克隆git,不带工作区的仓库

克隆仓库

  1. 将本地项目同步到远端仓库

    • 查看有无远端仓库连接
    1
    git remote -v
    • 建立与远端的联系
    1
    git remote  add  <server-file-name>  <server-path> //用名字指代地址

    建立与仓库的连接
    删除已存在的 remote

    1
    git remote remove <name>
    • 提交变更
    1
    2
    3
    git push <server-file-name>
    //当前分支没有与远程分支关联
    git push --set-upstream <server-file-name> <branch-name>

    提交变更

  • 获取远端的其他人提交的变更

    1
    2
    git 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
  • 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
2
3
4
5
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

解决办法
就是本地的 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

    push

    红色错误是 github 新建仓库时,在已经新建分支 master 存放了 license,本地分支 master 无法提交

  • 拉取远端分支

1
git fetch <server-name>

fetch

  • 将本地仓库中的 master 分支与远端分支合并 git merge

    1
    2
    3
    git merge github1/master
    //fatal: refusing to merge unrelated histories 没有关系的树,无法合并,根据git merge -h查看参数是否可以合并无关系 的树
    git merge --allow-unrelated-histories github1/master

merge

  • 提交 master 分支

    1
    git push github1 master

push


github 一个 bug,如果 github 注册邮箱和本地配置的 git 的 user.email 一  致将不会 commit 将不会显示本地配置的 user.name,而是显示 github 的头像和名字

  • 同时修改了同一文件的不同内容
     直接使用 git pull 拉取并自动合并冲突,git 会自动保留两部分修改内容

  • 同时修改了同一文件名
    使用 git pull 拉取,git 会同时保留两个文件,并且两个文件完全相同,diff 不出内容。
    使用 git status 的提示,通过同事间沟通保留文件名字
    同时修改文件名1
    同时修改文件名2

mac 终端命令

清空屏幕

1
clear

当前文件路径

1
pwd

拷贝文件

1
cp 文件相对路径 存放的相对路径

*改变当前目录

1
2
3
cd dirname进入下一层一路径
cd .. 返回上一层
cd ~ 返回根路径

拷贝文件夹

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
2
mv name1 name2 //将name1重命名为name2
mv dir1 dir2 //将路经dir1下的文件移动到dir2下

创建文件和内容

1
echo 'hello world' >readme

查看.git/objects 文件夹里面的类型为文件的文件

1
find .git/objects -type f/file

将普通文件内容打印到屏幕上

1
cat+文件名
-------------本文结束感谢阅读-------------