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 命令。