Git 使用总结
# git 简介
工作区(working directory),简言之就是你工作的区域。对于git而言,就是的本地工作目录。工作区的内容会包含提交到暂存区和版本库(当前提交点)的内容,同时也包含自己的修改内容。
暂存区(stage area, 又称为索引区index),是git中一个非常重要的概念。是我们把修改提交版本库前的一个过渡阶段。查看GIT自带帮助手册的时候,通常以index来表示暂存区。在工作目录下有一个.git的目录,里面有个index文件,存储着关于暂存区的内容。git add命令将工作区内容添加到暂存区。
本地仓库(local repository),版本控制系统的仓库,存在于本地。当执行git commit命令后,会将暂存区内容提交到仓库之中。在工作区下面有.git的目录,这个目录下的内容不属于工作区,里面便是仓库的数据信息,暂存区相关内容也在其中。这里也可以使用merge或rebase将远程仓库副本合并到本地仓库。图中的只有merge,注意这里也可以使用rebase。
远程版本库(remote repository),与本地仓库概念基本一致,不同之处在于一个存在远程,可用于远程协作,一个却是存在于本地。通过push/pull可实现本地与远程的交互;
远程仓库副本,可以理解为存在于本地的远程仓库缓存。如需更新,可通过git fetch/pull命令获取远程仓库内容。使用fech获取时,并未合并到本地仓库,此时可使用git merge实现远程仓库副本与本地仓库的合并。git pull 根据配置的不同,可为git fetch + git merge 或 git fetch + git rebase。
rebase和merge的区别:
- 可以看出merge结果能够体现出时间线,但是rebase会打乱时间线。
- 而rebase看起来简洁,但是merge看起来不太简洁。
- 最终结果是都把代码合起来了,所以具体怎么使用这两个命令看项目需要
# git 初始化
# 设置git全局信息
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
# windows和Linux上都建议设置
git config --global push.default simple # 我们要求git 版本1.9.5 以上
git config --global core.autocrlf false # 让git 不要管Windows/Unix换行符转换的事
# windows上还需要配置
git config --global core.ignorecase false # 设置大小写敏感
# 查看配置是否正确
git config --global --list
注: git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用 户名和Email地址。
# 查看Git全局设置信息
git config -l
# 修改远程地址仓库
git remote set-url origin [url]
# 创建SSH KEY
ssh-keygen -t rsa -C "youremail@example.com"
然后一路回车。这时你就会在用户下的.ssh目录里找到id_rsa和id_rsa.pub这两个文件,id_rsa.pub配置到github上
#检查配置是否成功
ssh -T git@github.com
如果遇到 yes/no 的选项,输入yes。最后看到 “Hi ....”表示设置成功。
# 创建版本库,初始化git仓库
通过git init命令把这个目录变成Git可以管理的仓库
git init
# 添加文件
用命令git add告诉Git,把文件添加到仓库
git add file.txt
# 提交文件
用命令git commit告诉Git,把文件提交到仓库:
git commit -m "first commit"
# 查看仓库状态
git status
# 查看修改内容
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记 不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看
git diff
# git 时光机
# 版本回退
#显示从最近到最远的提交日志
git log
#如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
git log --pretty=oneline
在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本 就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
#回到上一个版本
git reset --hard HEAD^
#回到任意一个版本 commitId
git reset --hard commitId
#你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?在Git中,总是有后悔药
可以吃的。当你用$ git reset --hard HEAD^回退到上个版本时,再想恢复,就必须找到commit id。Git提供了一个命令git reflog用来记录
你的每一次命令
git reflog
commitId版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
# 工作区和暂存区
工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learnGit文件夹就是一个工作区
版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向 master的一个指针叫HEAD。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
# 撤消修改
#可以丢弃工作区的修改,回到最近一次git commit或git add时的状态
git checkout -- file
#暂存区的修改撤销掉
git reset HEAD <file>
# 分支管理
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 创建分支:
git branch <name>
# 切换分支:
git checkout <name>或者git switch <name>
# 创建+切换分支:
git checkout -b <name>或者git switch -c <name>
# 合并某分支到当前分支:
git merge <name>
# 复制一个特定的提交到当前分支
git cherry-pick 4c805e2
# 删除分支:
git branch -d <name>
# 删除远程分支
git push origin --delete [branchname]
# 分支合并图
git log --graph
# 查看远程库信息
git remote
# 查看远程库详细信息
git remote -v
# 从本地推送分支,如果推送失败,先用git pull抓取远程的新提交
git push origin branch-name
# 在本地创建和远程分支对应的分支
git checkout -b branch-name origin/branch-name
# 建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name;
#推送本地分支到远程
git push origin newbranch:newbranch
# 从远程抓取分支
git pull
# 撤销
# 撤销所有未执行git add命令的文件新增
git clean -xdf
# 撤销所有未执行git add命令的文件修改
git checkout .
git checkout -- <file>
# 撤销所有已添加git add 文件
git reset HEAD .
# 撤销所有已添加git commit 文件,回到上一次commit的状态
git reset --hard HEAD^
# 搭建git服务器
# 1.安装git
yum –y install git
# 2.查看git版本
git --version
# 3.创建用户:在服务器中创建一个git专属用户
useradd git
passwd git
# 4.禁止该git用户使用shell登录系统(为了安全性,一般都禁止),按i进入编辑模式,在最后一行将git用户修改成以下配置
vi /etc/passwd
git:x:1000:1000::/home/git:/usr/bin/git-shell
# 5.创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,没有可以创建一个。
# 6.初始化Git仓库 先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令
git init --bare sample.git
sudo chown -R git:git sample.git
# 7.克隆远程仓库
git clone git@server:/srv/sample.git
# 上传项目到github
# 1.初始化git项目
git init
# 2.添加文件到暂存区
git add .
# 3.提交文件到本地仓库
git commit -m "初始化提交"
# 4.github创建仓库
# 5.关联远程仓库
git remote add origin git@github.com:guojuna/Taunt.git
# 6.提交文件
git push -u origin master
# 7.如果提示异常failed to push some refs to 'github.com:guojuna/Taunt.git',需要把远程仓库和本地同步,消除差异,然后重新第6步提交
git pull origin master --allow-unrelated-histories
# 修改远程仓库
git remote set-url origin https://gitee.com/GuoJuna/GenerateCode.git
##问题
- git pull的时候遇到这样的问题:The following untracked working tree files would be overwritten by merge
git clean -d -fx