代码改变世界

git 使用笔记

2015-09-10 18:55  sylar_liang  阅读(246)  评论(0编辑  收藏  举报

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