一、git server安装
1.1 server端安装
- yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
- yum install git // 安装git
- groupadd git // 创建git用户组
- useradd git -g git // 创建git用户并将其添加到git用户组中
- su git // 切换到git用户
- mkdir -p ~/.ssh && chmod 0700 ~/.ssh // 在home目录下创建 .ssh目录
- touch ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys // 创建authorized_keys文件
- git init --bare ~/projectname.git // 创建一个空的仓库
- chown -R git:git projectname.git // 设置git库的访问权限
1.2 client端安装
- cat ~/.ssh/id_rsa.pub // 查看ssh公钥信息
- ssh-keygen -t rsa -b 4096 -C "your_email@domain.com" // 如果没有就创建
- 将id_rsa.pub内容复制,到server端的authorized_keys文件中,实现免密登录传输
- cd /path/to/local/project // 切换到本地仓库目录
- git clone ssh://git@www.xxxxx.com:9003/~/projcetname.git
二、git 常用命令
参考文档:https://www.runoob.com/git/git-workspace-index-repo.html
- Workspace(工作区):你电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区。
- Index/Stage(暂存区):一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域啦。
- Repository(本地仓库):你执行git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD指向最新放入仓库的版本。当你执行git commit,文件改动就到本地仓库来了~
- Remote(远程仓库):就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库~
git命令 | 描述 |
---|---|
git config --list | 显示git配置信息 |
git config --global user.name 'xxxxx' | 设置提交的用户信息,包括用户名和邮箱 |
git config --global user.email 'xxxx@xxxxx.com' | 设置提交的用户信息,包括用户名和邮箱 |
git clone ’git://github.com/schacon/grit.git' | 克隆一个远程仓库到本地 |
git init | 初始化一个空的git本地仓库 |
git add *.go | 添加文件到暂存区 |
git commit -m message | 提交暂存区到本地仓库中 |
git status | 查看git仓库的状态 |
git diff | 比较文件的不同,即暂存区和工作区的差异 |
git reset | 回退版本 |
git rm | 删除工作区文件 |
git mv | 移动或重命名工作区文件 |
git log | 查看历史提交记录 |
远程操作 | |
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 从远程获取代码库,并合并 |
git push | 推送代码到远程仓库 |
分支管理 | |
git branch (branchname) | 创建分支命令 |
git merge | 合并分支 |
git branch | 列出分支命令 |
git branch -d (branchname) | 删除分支命令 |
git checkout (branchname) | 切换分支 |
git checkout . 或者git checkout -- <file> | <font color='red'>会用暂存区全部或指定文件替换工作区的文件</font> |
git checkout HEAD . 或者git checkout HEAD <file> | <font color='red'>会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。</font> |
git 查看提交历史 | |
git log | 查看提交历史 |
git blame (file) | 查询制定文件的修改记录 |
git 标签 | |
git tag -a v1.0 | 版本打标签 |
git tag | 查看所有标签 |
三、git 使用技巧
3.1 git撤销提交的方法
- 首先,使用git log -n 3 --stat命令,可以查看最近3次提交的详细信息,并且会显示每次commit的哈希值。
- git reset --soft 某次commit哈希值的任意前缀
- git push origin master --force
- 强制提交之后,那次commit之后所有的修改都处于没有提交的状态,可以再修改文件,然后将他们都再添加提交即可。
- 使用git commit -m命令再提交新的commit。
3.2 git 放弃本地修改
- 场景1.本地修改尚未提交到暂存区, 即本地代码修改还没有执行(git add),使用命令
git checkout -- <file>
// 放弃全部修改
git checkout .
- 场景2. 本地修改已经先提交暂存区,执行的git add,但没有提交git commit, 撤销缓存提交
// 放弃修改指定文件
git reset HEAD <file>
// 放弃修改所有文件
git reset HEAD .
- 场景3. 已经git commit 提交,版本回退
// 回退到前一个版本
git reset --hard HEAD^
//回退到指定版本
git reset --hard commitid
note:
- HEAD表示当前版本, HEAD^表示上个版本, HEAD^^表示上上个版本
- commitid通过git log获取,直接使用版本号的前几个字符串即可。(git log --pretty=oneline 一行显示)
- 要重返未来,用git reflog查看命令历史,以便确定要回到未来的版本
3.3 git 使用非标准的ssh端口(非22)
在做内网穿透的时候,使用了端口9003,在我使用 “git@www.xxxxx.com:9003/~/xxxx.git” 时发现不能进行git clone等命令操作;原来,当ssh的端口访问改变的时候,原来的方式就不行了,需要使用新的方式
代码语言:txt复制 git clone ssh://git@www.xxxxx.com:9003/~/xxxx.git
四、日常开发中常用的命令
- git clone
- git checkout -b dev
- git add
- git commit
- git log
- git diff
- git status
- git pull/git fetch
- git push
git clone
当我们要进行开发,第一步就是克隆远程版本库到本地呢
代码语言:txt复制git clone url 克隆远程版本库
git checkout -b dev
克隆完之后呢,开发新需求的话,我们需要新建一个开发分支,比如新建开发分支dev
创建分支:
代码语言:txt复制git checkout -b dev 创建开发分支dev,并切换到该分支下
git add
git add的使用格式:
代码语言:txt复制git add . 添加当前目录的所有文件到暂存区
git add [dir] 添加指定目录到暂存区,包括子目录
git add [file1] 添加指定文件到暂存区
有了开发分支dev之后,我们就可以开始开发啦,假设我们开发完HelloWorld.java,可以把它加到暂存区,命令如下
代码语言:txt复制git add Hello.java 把HelloWorld.java文件添加到暂存区去
git commit
git commit的使用格式:
代码语言:txt复制git commit -m [message] 提交暂存区到仓库区,message为说明信息
git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
git commit --amend -m [message] 使用一次新的commit,替代上一次提交
把HelloWorld.java文件加到暂存区后,我们接着可以提交到本地仓库啦~
代码语言:txt复制git commit -m 'helloworld开发'
git status
git status,表示查看工作区状态,使用命令格式:
代码语言:txt复制git status 查看当前工作区暂存区变动
git status -s 查看当前工作区暂存区变动,概要信息
git status --show-stash 查询工作区中是否有stash(暂存的文件)
git log
git log,这个命令用得应该比较多,表示查看提交历史/提交日志~
代码语言:txt复制git log 查看提交历史
git log --oneline 以精简模式显示查看提交历史
git log -p <file> 查看指定文件的提交历史
git blame <file> 一列表方式查看指定文件的提交历史
git diff
代码语言:txt复制git diff 显示暂存区和工作区的差异
git diff filepath filepath路径文件中,工作区与暂存区的比较差异
git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异
git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异
git diff commitId filepath 与某一次提交的比较差异
git pull/git fetch
代码语言:txt复制git pull 拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地master分支
git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支
git fetch --all 拉取所有远端的最新代码
git fetch origin master 拉取远程最新master分支代码
有些伙伴可能对使用git pull还是git fetch有点疑惑,其实 git pull = git fetch git merge。pull的话,拉取远程分支并与本地分支合并,fetch只是拉远程分支,怎么合并,可以自己再做选择。
git push
git push 可以推送本地分支、标签到远程仓库,也可以删除远程分支哦。
代码语言:txt复制git push origin master 将本地分支的更新全部推送到远程仓库master分支。
git push origin -d <branchname> 删除远程branchname分支
git push --tags 推送所有标签
Git进阶之分支处理
Git一般都是存在多个分支的,开发分支,回归测试分支以及主干分支等,所以Git分支处理的命令也需要很熟悉的呀~
- git branch
- git checkout
- git merge
git branch
git branch用处多多呢,比如新建分支、查看分支、删除分支等等
新建分支:
代码语言:txt复制git checkout -b dev2 新建一个分支,并且切换到新的分支dev2
git branch dev2 新建一个分支,但是仍停留在原来分支
查看分支:
代码语言:txt复制git branch 查看本地所有的分支
git branch -r 查看所有远程的分支
git branch -a 查看所有远程分支和本地分支
删除分支:
代码语言:txt复制git branch -D <branchname> 删除本地branchname分支
git checkout
切换分支:
代码语言:txt复制git checkout master 切换到master分支
git merge
我们在开发分支dev开发、测试完成在发布之前,我们一般需要把开发分支dev代码合并到master,所以git merge也是程序员必备的一个命令。
代码语言:txt复制git merge master 在当前分支上合并master分支过来
git merge --no-ff origin/dev 在当前分支上合并远程分支dev
git merge --abort 终止本次merge,并回到merge前的状态
Git进阶之处理冲突
Git版本控制,还是多个人一起搞的,多个分支并存的,这就难免会有冲突出现~
Git合并分支,冲突出现
同一个文件,在合并分支的时候,如果同一行被多个分支或者不同人都修改了,合并的时候就会出现冲突。
举个粟子吧,我们现在在dev分支,修改HelloWorld.java文件,假设修改了第三行,并且commit提交到本地仓库,修改内容如下:
代码语言:txt复制public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,捡田螺的小男孩!");
}
}
我们切回到master分支,也修改HelloWorld.java同一位置内容,如下:
代码语言:txt复制public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,jay!!");
}
}
Git解决冲突
Git 解决冲突步骤如下:
- 查看冲突文件内容
- 确定冲突内容保留哪些部分,修改文件
- 重新提交,done
1.查看冲突文件内容
git merge提示冲突后,我们切换到对应文件,看看冲突内容
2.确定冲突内容保留哪些部分,修改文件
- Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,
- <<<<<<<HEAD是指主分支修改的内容,>>>>>>> dev是指dev分支上修改的内容
所以呢,我们确定到底保留哪个分支内容,还是两个分支内容都保留呢,然后再去修改文件冲突内容~
3.修改完冲突文件内容,我们重新提交,冲突done
Git进阶之撤销与回退
Git的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操作。
代码在Git的每个工作区域都是用哪些命令撤销或者回退的呢
有关于Git的撤销与回退,一般就以下几个核心命令
- git checkout
- git reset
- git revert
git checkout
如果文件还在工作区,还没添加到暂存区,可以使用git checkout撤销
代码语言:txt复制git checkout [file] 丢弃某个文件file
git checkout . 丢弃所有文件
git reset
git reset的理解
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本.
为了更好地理解git reset,我们来回顾一下,Git的版本管理及HEAD的理解
Git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一般指向当前分支,如下:
假设执行git reset,回退到版本二之后,版本三不见了
git reset的使用
Git Reset的几种使用模式
代码语言:txt复制git reset HEAD --file
回退暂存区里的某个文件,回退到当前版本工作区状态
git reset –-soft 目标版本号 可以把版本库上的提交回退到暂存区,修改记录保留
git reset –-mixed 目标版本号 可以把版本库上的提交回退到工作区,修改记录保留
git reset –-hard 可以把版本库上的提交彻底回退,修改的记录全部revert。
先看一个粟子demo吧,代码git add到暂存区,并未commit提交,就以下酱紫回退,如下:
代码语言:txt复制git reset HEAD file 取消暂存
git checkout file 撤销修改
再看另外一个粟子吧,代码已经git commit了,但是还没有push:
代码语言:txt复制git log 获取到想要回退的commit_id
git reset --hard commit_id 想回到过去,回到过去的commit_id
如果代码已经push到远程仓库了呢,也可以使用reset回滚哦(这里大家可以自己操作实践一下哦)~
代码语言:txt复制git log
git reset --hard commit_id
git push origin HEAD --force
git revert
与git reset不同的是,revert复制了那个想要回退到的历史版本,将它加在当前分支的最前端。
revert之前:
revert 之后:
当然,如果代码已经推送到远程的话,还可以考虑revert回滚呢
代码语言:txt复制git log 得到你需要回退一次提交的commit id
git revert -n <commit_id> 撤销指定的版本,撤销也会作为一次提交进行保存
Git进阶之标签tag
打tag就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去。
代码语言:txt复制git tag 列出所有tag
git tag [tag] 新建一个tag在当前commit
git tag [tag] [commit] 新建一个tag在指定commit
git tag -d [tag] 删除本地tag
git push origin [tag] 推送tag到远程
git show [tag] 查看tag
git checkout -b [branch] [tag] 新建一个分支,指向某个tag
Git其他一些经典命令
git rebase
rebase又称为衍合,是合并的另外一种选择。
假设有两个分支master和test
代码语言:txt复制 D---E test
/
A---B---C---F--- master
执行 git merge test得到的结果
代码语言:txt复制 D--------E
/
A---B---C---F----G--- test, master
执行git rebase test,得到的结果
代码语言:txt复制A---B---D---E---C‘---F‘--- test, master
rebase好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull --rebase
git stash
stash命令可用于临时保存和恢复修改
代码语言:txt复制git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 显示保存的工作进度列表
git stash pop stash@{num} 恢复工作进度到工作区
git stash show :显示做了哪些改动
git stash drop stash@{num} :删除一条保存的工作进度
git stash clear 删除所有缓存的stash。
git reflog
显示当前分支的最近几次提交
git blame filepath
git blame 记录了某个文件的更改历史和更改人,可以查看背锅人,哈哈
git remote
代码语言:txt复制git remote 查看关联的远程仓库的名称
git remote add url 添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息