Git命令总结及问题解决

2019-06-15-Git

前言

  • 关于 /etc/profile 、 /etc/bashrc 与 ~/.bashrc、~/.bash_profile
    1
    2
    /etc/profile # 用于系统变量
    # 该文件为系统的每个用户设置环境变量信息, 当用户第一次登录时, 该文件被执行, 并从/etc/profile.d目录的配置文件中搜集shell的设置
    1
    2
    /etc/bashrc  # 用于保存bash信息
    # 为每个运行bash shell的用户执行此文件, 当bash shell 被打开, 该文件被读取
    1
    2
    ~/.bashrc
    # 该文件包含专用于你的bash shell 的bash信息, 当登录时以及每次打开新的shell时, 该文件被读取
    1
    2
    ~/.bash_profile
    # 每个用户都可使用该文件输入专用于自己使用的shell信息, 当用户登录时, 该文件仅仅执行一次, 默认情况下, 设置一些环境变量, 执行用户的.bashrc文件

Git 简介

1.1 Git的历史:

  • Linus torvalds 在1991年时发布了Linux操作系统,从那以后Linux系统便不断发展壮大,但因为不断有无数的开源爱好者提供源码,而Linus torvalds每次都是手动合入相关代码。一直到2002年,Linux系统经过十余年的不断发展,代码库已经庞大到无法再通过手工的方式管理了,但是Linus真的很不喜欢类似于 CVS或者Subversion 的一些版本控制系统,于是商业公司BitMover决定将其公司的BitKeeper分布式版本控制系统授权给Linux开发社区来免费使用,当时的BitKeeper可以比较文件内容的不同,还能够将出错的文档还原到历史某个状态,Linus终于放下了心里的石头。就这样平静的度过了三年时间,但是Linux社区聚集着太多的黑客人物,2005年时,那位曾经开发Samba服务程序的Andrew因为试图破解BitKeeper软件协议而激怒了BitMover公司,当即决定不再向Linux社区提供免费的软件授权了,此时的Linus其实也早已有自己编写分布式版本控制系统的打算了,于是便用C语言创建了Git分布式版本控制系统,并上传了Linux系统的源代码。

  • CVS/SVN:集中式的版本控制系统 – 版本库是集中存放在中央服务器,工作时用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。集中式版本控制系统最大的毛病就是必须联网才能工作;

  • Git:分布式的版本控制系统 – 布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,工作时不需要联网。

Git的原理:

  • 本地工作目录:在工作目录中修改数据文件。
  • 暂存区域(stage/index):将文件的快照放入暂存区域, 一般存放在.git目录下的index(.git/index)文件中
  • Git数据库:将暂存区域的文件快照提交到Git仓库中。
  • 文件上传至Git暂存区
  • 文件上传至Git版本仓库

Git 基本使用操作

Git 的安装与配置命令:

1
2
3
4
5
6
# git config 命令:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config --global core.editor vim
git config -e [--global]
git config --list

Git 初始化仓库命令:

1
2
3
4
5
# 首先建立本地版本库并初始化本地版本库:
mkdir anyue
cd anyue
git init [project-name]
git clone [url] # 支持ssh、https、git 协议

Git 代码提交命令:

1
2
3
4
touch readme.txt
git add redame.txt # 将该文件添加到暂存区,每次修改都要进行文件的add
git add . # . 代表全部文件
git commit -m "add readme.txt" # 将暂存区的文件提交到Git版本仓库

Git 查看信息命令:

1
2
3
4
5
6
7
8
9
10
11
12
git status   # 显示变更的文件

git log # 显示当前分支的版本历史
git log --stat # 显示commit历史, 以及每次commit发生变更的文件
git log -5 --pretty=oneline # --pretty=format:%s

git diff readme.txt # 查看difference,显示的格式正是Unix通用的diff格式

git reflog # 查看所有的历史记录,可以回退到未来

git reset --hard HEAD^ # 回退到上一次提交版本
git reset --hard 1094a # 回退到 1049a 为SHA-1值

Git 分支命令

1
2
3
4
5
6
7
8
9
10
11
git branch      # 列出所有本地分支 
git branch -r # 列出远程分支
git branch -a # 列出所有本地+远程分支
git branch --set-upstream [branch] [remote-branch] # 建立追踪关系, 在现有分支与指定的远程分支之间
git branch anyue # 创建anyue分支

git checkout anyue # 切换anyue分支,
git checkout -b anyue # 创建并切换
git checkout - # 切换到上一个分支

git merge [branch] # 合并指定分支到当前分支

Git 标签命令

1
2
3
4
git tag  # 列出所有标签
git tag [tagname] [commit] # 新增一个tag在当前commit, 也可指定
git tag -d [tagname] # delete
git show [tag] # 查看tag信息

Git 远程同步命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
git fetch origin hexo     # 下载远程仓库的所有变动
git merge FETCH_HEAD

git remote -v
git remote remove [remote-name]

git remote add [shortname] [url]
git remote add origin git@server-name:path/repo-name.git # 关联远程仓库

git pull [remote] [branch] # 取回远程仓库的变化,并与本地分支合并
git push [remote] [branch]
git push [remote] --force
git push [remote] --all

# 关联remote库地址并与本地库同步合并
git remote add origin https://github.com/githubusername/demo.git
git pull --rebase origin master

# 推送本地库并查看状态
git push -u origin master
git status
git remote -v # 查看远程库地址

git checkout master
git merge anyue # 切换到master主分支,并把anyue分支合入到当前分支

git branch -d anyue # 删除anyue分支
git log --graph --pretty=oneline --abbrev-commit # 查看分支变化

Git 撤销命令

1
2
3
4
5
6
7
8
git checkout .   # 恢复暂存区的所有文件到工作区
git checkout [file]
git checkout [commit] [file]

git reset --hard # 重置暂存区与工作区, 与上一次commit保持一致
git reset [file] # 重置暂存区指定文件,与上一次commit保持一致, 但工作区不变
git reset [commit] # 重置当前分支的指针为指定commit, 同时重置暂存区, 但工作区不变
git archive

Git 进阶操作(平时使用遇到问题总结)

1、2019-05-14 出现Failed to connect to github.com port 443: Timed out

  • 原因:

    • 本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,ssh 阻塞了22端口,需要配置验证信息;
  • 解决问题方法:

    • ssh-keygen -t rsa -C "youremail@example.com" 一路回车,生成公钥/私钥于当前用户的.ssh目录;
    • 将此目录下的id_rsa.pub里的内容复制到远端的git配置中(ssh),在.ssh目录中新建config文件,将如下复制其中:
    1
    2
    3
    4
    5
    6
    Host github.com  
    User git
    Hostname ssh.github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
    Port 443
    • 测试连接是否通畅:
    1
    2
    ssh -T git@github.com  或者  ssh -V git@github.com
    Hi anyue-1993! You've successfully authenticated, but GitHub does not provide shell access

2、2019-5-17 fork 后所要进行的操作

1
2
3
4
5
git clone https://github.com/anyue967/docker_practice.git  #	clone至本地库
git remote add upstream 源仓库地址 # 增加源仓库地址,以便为了同步
git checkout -b newbranch # 切换至创建好的新分支,一般不在主分支上进行操作
Pull requests New pull request,
git pull upstream master # 同步源仓

操作参考文档

3. 2019-5-18 git 设置别名的操作

1
2
git config --global alias.lol 
"log --graph --decorate --pretty=oneline --all --abbrev-commit" # 实现查看项目提交、合并等记录

4. git 出现 fatal: refusing to merge unrelated histories 错误

  • 原因:
    • 其实这个问题是因为 两个 根本不相干的 git 库, 一个是本地库, 一个是远端库, 然后本地要去推送到远端, 远端觉得这个本地库跟自己不相干, 所以告知无法合并.
  • 解决方法:
    • git pull origin master --allow-unrelated-histories

5. 2019-8-14 已存在的项目如何git

  • 到github创建新仓库

  • cd到已存在项目的目录,

    1
    2
    3
    git init
    git add .
    git commit -m "Initial commit"
  • 如下操作:

    1
    2
    3
    4
    5
    6
    git remote add origin Your's Repo  # 若fatal: remote origin already exits
    git remote rm origin

    git push -u origin master # 失败执行
    git pull --rebase origin master # 执行 push, 若不能pull代码, 执行
    git branch --set-upstream master origin/master

6. 关于 git checkout

  • 作用:
    • 切换分支或恢复工作树文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    git branch newbranch  # 创建

    git checkout newbranch # 切换
    git checkout -b newbranch # 综合

    $ cat .git/HEAD # HEAD永远指向当前分支名
    ref: refs/heads/hexo

    # 恢复暂存区的指定文件到工作区
    git checkout [file]

7. 关于git create mode 100644

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
git clone https://github.com/HikoQiu/kubeadm-install-k8s.git

git remote -v
origin https://github.com/HikoQiu/kubeadm-install-k8s.git (fetch)
origin https://github.com/HikoQiu/kubeadm-install-k8s.git (push)
git submodule init
git submodule update

git remote remove origin
git remote add origin https://github.com/anyue967/Linux.git
git remote -v
origin https://github.com/anyue967/Linux.git (fetch)
origin https://github.com/anyue967/Linux.git (push)

git remote add upstream https://github.com/HikoQiu/kubeadm-install-k8s
git remote -v
origin https://github.com/anyue967/Linux.git (fetch)
origin https://github.com/anyue967/Linux.git (push)
upstream https://github.com/HikoQiu/kubeadm-install-k8s.git (fetch)
upstream https://github.com/HikoQiu/kubeadm-install-k8s.git (push)

git add kubeadm-install-k8s/
git commit -m "add kubeadm-install-k8s"
[master 7b23b5d] add kubeadm-install-k8s
57 files changed, 5369 insertions(+)
create mode 100644 docker/k8s/kubeadm-install-k8s/README.md
create mode 100644 docker/k8s/kubeadm-install-k8s/applications/Monocular
create mode 100644 docker/k8s/kubeadm-install-k8s/applications/Monocular

git push

8. SVN

  • 初始化repo: svnadmin create E:\SVN
  • 修改配置文件(conf): E:\SVN\conf
    • svnserve.conf:

      1
      2
      3
      4
      anon-access = read 
      auth-access = write
      password-db = passwd
      authz-db = authz
    • authz

      1
      2
      3
      4
      5
      6
      7
      [/]
      anyu967 = rw
      # [/foo/bar]
      anyu967 =rw
      * =
      # [repository:/baz/fuz]
      * =
    • passwd

      1
      2
      3
      4
      [users]
      # harry = harryssecret
      # sally = sallyssecret
      anyu967 = 123456
  • 启动SVN 服务: svnserve -d -r E:/SVN
  • 流程: checkout(初次) update--> lock--> modified--> commit

9. 关于push后文件夹显示灰色

  • 删除clone后文件的.git,.gitignore,然后重新add-commit-push
  • git rm -r --cached FILENAME

Git命令总结及问题解决
https://anyu967.github.io/posts/4bf6bbf0.html
作者
anyu967
发布于
2019年6月15日
许可协议