git操作整理

125 阅读10分钟

1、安装git

2、创建用户名和邮箱

git  config  --global user.name "xiaoming"
git  config  --global user.email "123456@163.com"

【
查看自己的用户名和邮箱地址:
git config user.name
git config user.email

修改自己的用户名和邮箱地址:
git config --global user.name "xxx"
git config --global user.email "xxx"

3、建立版本仓库

git init

4、在仓库的工作区拉代码,创建文件、添加到缓存区、提交到版本仓库

	git pull origin dev   	从远程的dev分支上拉取到本地的master分支上
    vim 1.php		创建并编辑1.php文件
    git status		查看当前工作区的状态
    git add 1.php	工作区中的1.php添加到暂存区
    git ls-files		查看暂存区中的文件信息
    git diff HEAD -- test.php	查看当前修改和版本库中文件的差别
    git diff test.php	查看当前修改和未修改前差别
    git commit -m  '版本修改说明'	提交到本地仓库
    git push origin 分支名   		推送到远程仓库 GitHub

5、查看日志

git log 查看所有的版本信息
git log --pretty=oneline    将提交id和提示信息压缩到一行
git reflog 查看版本操作命令(方便进行版本回到未来的操作)

6、版本回退

   git reset --hard HEAD^		回到上一版本
   git reset --hard HEAD^^		回到上上一版本
   git reset --hard HEAD~10		回到上10个版本
   git reset --hard 版本ID		回到id的版本(版本id可以只写前几位,git会自动去找,也不能只写两三位)

6、撤销工作区内容的修改(在commit之前)

   (未add之前的修改)      git checkout -- test.php(撤销test.php文件更新) / git checkout . (撤销所有的文件更新)
   会回退到最初的工作区的状态(就是让这个文件回到最近一次git commit或git add时的状态)不管有没有add 都可以使用

   (已经add但没有commit)     git reset HEAD test.php

 (已经commit但没有push到远程版本仓库)git reset --hard 版本ID  来实现版本的回退

总结:
     场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

     场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

     场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,git reset --hard 版本ID 来实现版本的回退,不过前提是没有推送到远程库。

7、删除文件

     1)先在本地文件管理目录进行删除  git rm test.php 然后提交到版本仓库 git commit -m 'delete test.php'  实现本地和版本仓库的一致性
     2)撤回删除  git checkout --  1.php   是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

8、远程仓库

如果用户下面没有.ssh/rd_rsa  和 .ssh/rd_rsa.pub,则进行如下操作
       第1步:生成秘钥文件    ssh-keygen -t rsa -C "邮箱"   一路下一步    最终在”C:\Users\xiaoming\.ssh“下看到2个文件  把rd_rsa.pub里的公钥复制下来
       第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
       第3步:团队开发,添加多个ssh key

9、添加远程仓库

   在github上创建一个新的仓库,假设仓库名称为study
   1、本地库与远程库建立联系
   git remote add origin git@github.com:自己的github账号名/study.git
   2、把本地仓库下的内容推送到GitHub仓库中
   git push -u origin master    把本地master分支推送到远程仓库的master分支中(第一次push需要加-u参数   master合并master可以省略一个master)
   git push -u origin master:developer    把本地master分支推送到远程仓库的developer分支中,再在远程master中进行合并
   3、以后只要本地做了提交到本地版本库,就可以使用下面命令推送到
   git push origin master   推送到GitHub

   假如远程仓库已经有了文件了,先得同步到本地
   git pull --rebase origin master     或者    git rebase orgin master

	从github拉取下来最新的和本地进行合并
   git pull origin dev   从远程的dev分支上拉取到本地的master分支上
   git pull origin dev:dev   从远程的dev分支上拉取到本地的dev分支上
   
    如果远程仓库走的是https协议,必须输入仓库的用户名和密码
    如果是ssh协议,则不需要,前提是初始化时的用户名和邮箱必须和远程仓库的保持一致

10、从远程库中克隆

    在github上创建一个新的版本仓库,命名为mygit
    克隆远程仓库到本地形成一个本地仓库
    git clone git@github.com:GitHub账号/mygit.git(既可以是git@github.com,也可以是https://github.com/GitHub账号/mygit.git)
    然后在本地的mygit库中查看同步的文件

11、分支

创建并切换到新分支  
git checkout -b dev				相当于: git branch dev(创建)  +  git checkout dev(切换)
git checkout -b dev origin/dev	创建本地dev分支,并于远程dev分支关联 
git switch -c dev				同样也是创建并切换分支		
git branch						查看当前分支
git branch -vv					查看当前分支是否与远程分支关联

将本地分支与远程分支关联
git branch --set-upstream-to=origin/dev dev
git branch --set-upstream-to dev origin/dev

分支合并: 
首先切换到主分支上  git checkout master
在主分支上进行合并  git merge dev

分支删除:
git branch -D dev  (-d 正常删除, -D 强制删除)

分支改名:
当前分支是要改名的分支		git branch -m newname
当前分支不是要改名的分支		git branch -m oldname newname

拉取远程分支(本地没有该分支)
git checkout -b 分支名 origin/分支名   /   git fetch origin 分支名   /  git pull origin 分支名	后面两个不管用

如果报错:
fatal: Cannot update paths and switch to branch '分支名' at the same time.
Did you intend to checkout 'origin/分支名' which can not be resolved as commit?

执行 git fetch      然后再执行 git checkout -b 分支名 origin/分支名

12 rebase

开发时,会有多条commit记录,提交远程时同一个功能有多个commit记录,将多个合并成一个
git rebase -i HEAD~4(4 表示合并几条,从最近的一条记录往前数)
这时候,会自动进入 vi 编辑模式:
保留那个提交,就将commit前 保留 p
合并那个提交,就将commit前 改为 s

p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like “squash”, but discard this commit’s log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit


保存后,会再次进入vi模式:将要隐藏的提交信息前面注释掉,git log时展示未注释的信息

12、冲突解决

    1)当在一个分支上修改一个文件提交到分支版本库时,同时主分支也进行修改该文件并进行提交, 接着进行合并时就会出现冲突
    2)直接在主分支上打开冲突文件(可以使用git status查看),并进行相应的修改,最后提交即可
    3)删除分支
    4)git log --graph --pretty=oneline --abbrev-commit 可以看到分支合并图

13、分支处理策略

     master分支只作为发布版本,平时不在上面操作
     dev分支用来做开发使用,每个人往dev分支上开发,最后进行合并
     git merge --no-ff -m "merge with no-ff" dev

14、BUG分支

假定手头有分工作正在dev分支上操作,但是没有完成,但此时需要修复BUG   可以先隐藏当前的分支     git stash

通过git status  查看工作区

假设需要在主分支上修复BUG,此时切换到主分支上去     git checkout master

在主分支上创建BUG分支   git checkout -b  bug_01    在BUG分支完成修改提交后,切换到主分支进行合并并删除掉BUG分支

接着重新跳到dev分支上工作   git checkout dev

查看暂存的内容	git stash list

恢复暂存的更新代码    
git stash		仅恢复	需要删除暂存记录使用 git stash drop(仅会删除已还原的stash)
git stash pop	恢复并删除暂存的文件

15、强行删除(一个未合并的)分支

 git branch -D feature-vulca

16、将某个提交复制到当前分支

git chrry-pick connitId

16、多人操作

       查看远程仓库  git remote  -v
       推送分支  git push origin master     git push origin dev

       master分支是主分支,因此要时刻与远程同步;
       dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
       bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
       feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

17 多人协作开发

    多人协作的工作模式通常是这样:

    首先,可以试图用git push origin branch-name推送自己的修改;

    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

    如果合并有冲突,则解决冲突,并在本地提交;

    没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

18、打标签方面更好的查找,比版本ID更容易记

      在指定分支上添加标签  git  tag v1.0
      创建带有说明的标签     git tag -a v0.1 -m "version 0.1 released" 3628164
      查找所有的标签           git tag
      查看所有的版本信息    git log --pretty=oneline --abbrev-commit
      查看标签信息              git show v0.1
      删除标签                    git tag -d v0.1
      推送标签到远程          git push origin v0.1       git push origin  --tags
      删除已经推送到远程的标签     先在本地删除  git tag -d v0.1      再删除远程  git push origin :refs/tags/v0.1

19、远程分支强制覆盖本地分支

git fetch --all
git reset --hard origin/master
git pull

20、搭建git服务器

第一步,安装git    yum -y install git
第二步,创建git用户来管理git      adduser git
第三步,创建证书登陆     收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
第四步,初始化Git仓库: 先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令     git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。
然后,把owner改为git: chown -R git:git sample.git
第五步,禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
	git:x:1001:1001:,,,:/home/git:/bin/bash
	改为:
	git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
第六步,克隆远程仓库: git clone git@server:/srv/sample.git		 

21、git 查看文件为何命中忽略规则

git check-ignore -v test.txt

22、git 配置命令别名

git config --global alias.st status

其他:
git diff 比较的是工作区文件与暂存区文件的区别(上次git add 的内容) git diff --cached 比较的是暂存区的文件与仓库分支里(上次git commit 后的内容)的区别

git diff比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。 若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。