1. 授权同步
#ssh-keygen -t rsa -C "yourEmail@xxx.com"
按提示输入路径 /root/.ssh/id_rsa ,再连续输入2次 Enter 即可.
#cd /root/.ssh
将 id_rsa.pub 内容拷贝到要授权的账号的 Setting 的SSH里
2. Git 常用命令
概念:
工作区: Linux/Windows 下的文件夹所在目录.
暂存区Stage:
版本库:
#git init
#git add . // 添加所有修改的文件
#git commit -m "xxx" // 提交到仓库
#git status // 查看状态
#git diff xxx.file // 查看xxx文件与远程服务器
#git branch // 查看本地分支
#git branch -r // 查看远程分支
#git push origin dev // 将本地的dev分支推送到远程
#git push origin : heads/dev // 删除远程的dev分支
#git log // 查看提交历史记录,如果嫌输出信息太多,可添加参数 --pretty=oneline
#git log --pretty=oneline
#git log --graph --pretty=oneline --abbrev-commit // 查看分支的合并情况
// 其中, --graph 表示用ASCII字符串表示的简单图形,形象得展示每个提交所在的分支及其分化衍合情况。
// --abbrev-commit 表示git会为你的SHA-1 值生成简短唯一的缩写,默认为7个字符来表示
#git reflog // 记录你的每一次提交。 可根据版本号恢复
#git reset --hard HEAD^ // 回退到上一个版本, 上2个版本是 HEAD^^ , 上100个版本是 HEAD~100
#git reset --hard elde17 // 也可以通过输入 6位哈希值 回退到指定版本
#git checkout -- xxx // 丢弃工作区的修改(让文件回到最近一次 git commit 或 git add 状态)。包括2种情况:
1> xxx 修改后还未放到暂存区。(即还没执行操作 git add xxx )
2> xxx 提交到暂存区后,又作了修改,现在需要撤销回到 暂存区 后的状态。也就是 git add 后的状态.
#git reset HEAD xxx // 将暂存区stage 的修改撤销掉
git reset 可以回退版本,也可以将暂存区的修改退回给工作区。
1> 当只是改乱了某个文件,并未执行 git add 操作时,直接 git checkout -- xxx 恢复文件.
2> 当你改乱了某个文件,并执行操作 git add , 想丢弃修改,需要执行2步:
git reset HEAD xxx;
git checkout -- xxx;
3> 当已经提交了不何时的修改到版本库,想要撤销本次提交, 只能 版本回退。 git reset --hard HEAD^
#git rm xxx // 删除文件
1> 确实要删除 xxx 文件, 执行
#git rm xxx
#git commit -m "delete xxx"
2> 错删了 xxx 文件, 已经执行了 git rm xxx 操作
#git reset HEAD -- xxx // 从最新版本库中获取 xxx 文件
#git checkout -- xxx // 将最新版本库中的xxx.txt 文件恢复到工作区
建立新仓库:
1> 适当的地方创建一个文件夹, 执行
#git init
2> 添加文件
#git add .
#git commit -m "add files"
3> 关联远程库
#git remote add origin git@github.com:xxx/xxx.git //
4> 将本地库的所有内容推送到远程库上
#git push -u origin master
// 第一次推送master分支时,加上-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来.
// 以后的推送就只要使用命令 git push origin master
首次使用git的clone 或 push 命令连接github,会得到一个警告,输入 yes 即可。
提示错误:
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:sylarkim/yond.git'
hint: Updates were rejected because the tip of your current branch is behind
解决:
#git pull // 把最新的代码抓取下来
// 如果git pull 也失败,原因是没有指定本地dev分支与远程的origin/dev分支的链接。
#git branch --set-upstream dev origin/dev // 设置dev 和 origin/dev 的链接
#git pull // 再次执行pull操作。执行成功,但是合并有问题,需要手动解决冲突,解决后,git add, git commit, git push
#git push origin dev
克隆
#git clone git@github.com:xxx/xx.git
创建合并删除分支
#git branch // 查看当前分支; 如 *master 当前分支前面会标一个*号
#git checkout -b dev
// 相当于下面的2条
#git branch dev // 创建dev分支
#git checkout dev // 切换到dev分支
如在dev分支上做了修改,正常git add,git commit 后,要合并到master上
#git checkout master // 切换回master分支
#git merge dev // 将dev分支合并到master
#git merge --no-ff -m "merge with no-ff" dev // 合并分支时,git通常用Fast forward模式,这种模式,删除分支后,会丢失分支信息。
// 使用参数 --no-ff 禁用Fast forward
删除分支
#git branch -d dev // 删除dev分支
当dev工作进行到一半,出现个bug需要立刻处理,而dev内容由于未完成无法提交,可通过
1> git stash // 把当前工作现场储藏起来
2> git status // 此时工作区是干净的
3> git checkout master // 切换到主分支
4> git checkout -b bug1 // 新建一个bug1分支
...
5> git add, git commit
6> git checkout master
7> git merge --no-ff -m "fixed bug1" bug1 // 合并bug1到master
8> git branch -d bug1 // 删除bug1分支
9> git checkout dev // 切换回dev分支
10> git stash list // 查看刚才存储的工作现场
11>
>> 方法1:
git stash apply // 此命令恢复,但stash内容并不删除,需要用 git stash drop 来删除.
如:
# git stash apply stash@{0}
>> 方法2:
#git stash pop // 恢复的同事把stash内容也删了,推荐使用此命令
#git stash list // 再次查看是否还存在内容
dev下新建一个分支f1,在分支f1上已git add, git commit,再切回dev分支时,突然dev不想要f1分支,执行
#git branch -d f1 // 删除分支,失败, 改成
#git branch -D f1 // 强行删除,丢弃一个没有被合并过的分支
#git remote // 查看远程库的信息。 参数 -v 显示更详细的信息
#git push origin master // 将master 分支推送到远程对应的分支上
#git push origin dev // 推送dev分支
master 分支是主分支,要时刻与远程同步
dev分支是开发分支,团队所有成员都在上面工作,所以也需要与远程同步
小伙伴要在dev上开发,就必须创建origin的dev分支到本地:
#git checkout -b dev origin/dev
... // 对dev分支进行add,commit操作
#git push origin dev
多人协作的工作模式通常为:
1> 试图用 git push origin branch-name // 推送自己的修改
2> 推送失败,则因为远程分支比你本地的更新,需要git pull 试图合并
3> 如果 git pull 失败,说明远程分支与本地分支的链接关系没有建立,执行:
#git branch ---set-upstream branch-name origin/branch-name // branch-name 可以任意命名,如dev
4> 如果合并有冲突,手动解决冲突, add,commit,再git push origin branch-name 推送
本地新建的分支,如果不推送到远程,对其他人是不可见的
创建标签:
#git checkout master // 切换到master分支
#git tab v1.0 // 创建标签
#git tag // 查看所有标签
为 版本 打一个标签
#git tag v0.9 cc17032 // cc17032 为版本的SHA-1 值
#git tag // 查看标签
#git show v0.9 // 查看标签信息
#git tag -a v0.1 -m "version 0.1" cc17032 // 其中 -a 指定标签名; -m 指定说明文字; -s 用密匙签名
#git tag -d v0.1 // 删除标签
#git push origin tagname // 将标签推送到远程
#git push origin --tags // 一次性推送全部尚未推送到远程的本地标签
如果已推送到远程,想删除标签,则
1> git tag -d v0.9 // 先删除本地的标签
2> git push origin : refs/tags/v0.9 // 远程删除标签
git配置项
#git config --global color.ui true // git会适当地显示不同的颜色
忽略特殊文件
1> 新建一个.gitignore 文件
2> 编写忽略文件内容:
# ignore *.o
*.o
# ignore *.swp
*.swp
# ignore sbin bin
sbin
bin
配置别名
git config --global alias.st status // st代替status
git st // 相当于git status
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.co checkout
以后提交就可以写成:
git ci -m "xxx"
--global 参数是全局参数,也就是这些命令在这台电脑的所有git仓库下都有用。
git config --global alias.unstage 'reset HEAD' // 撤销修改
git config --global alias.last 'log -1' // 显示最近一次的提交
// 实用技巧
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
//git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
--global是针对当前用户起作用,不加,则只针对当前的仓库起作用。
每个仓库的配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删除即可。
当前用户的git配置文件放在主目录的.gitconfig中.配置别名可以直接修改这个文件,如果改错了,可以删掉
文件通过命令设置。
搭建git服务器
1>sudo apt-get install git // 最好在Ubuntu或Debian下搭建。
2>sudo adduser git // 创建一个git用户
3>创建证书登陆,也就是id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个
4>初始化git仓库
选定一个目录,如/usr/local
sudo git init --bare smart.git // 创建一个裸仓库,因为服务器上的git仓库纯粹是为了共享,不让用户直接登陆到服务器上去改工作区。
sudo chown -R git:git smart.git // 把owner改为git
5>禁用shell登陆。出于安全考虑
编辑/etc/passwd,找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登陆shell。
6>克隆远程仓库
git clone git@server:/xxx/smart.git