1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
// 参考网址: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 /* 工作目录 -> 工作区 .git目录 -> 版本库(Repository) .git/index(或者叫stage) -> 暂存区 创建Git版本库时,git会为我们自动创建第一个分支master,以及指向master的一个指针HEAD */ # 本地仓库 // 创建git仓库 git init // 创建 README.md 将其添加文件到暂存区 git add README.md // 把暂存区的内容提交到仓库 git commit -m "备注内容" // 修改 README.md 查看文件改动情况 git status // 比较当前README.md和仓库中的README.md的差别 git diff README.md // 查看git提交日志(加上oneline参数可以在一行中显示) git log [--pretty=oneline] // 版本还原 HEAD当前版本 HEAD^上一个版本 HEAD^^上两个版本 HEAD~100上100个版本 git reset --hard HEAD^ // 或者直接填版本号(版本号是一个hash值,填写前面一部分也行,只要能区分不同版本) git reset --hard <your_commit_id> // 如果git退到之前版本 此时HEAD就不再是最新版本 此时电脑重启就找不到最新版本的版本号了 无法再次回到最新版本 // 可以使用git reflog来查看你的每一次操作及相应的版本号缩写 git reflog // 修改 README.md 还未add到暂存区,想要撤销修改 --必须填写 否则就变成了切换分支 // 同样,如果本地删除了 README.md 也可以用checkout还原 git checkout -- README.md // 修改 README.md 并且已经add到了暂存区 先reset再checkout git reset HEAD README.md // 删除README.md并从版本库中将其删除 git rm README.md # 远程仓库(使用github作为远程仓库,如果你要使用私有远程仓库,可以自己搭建一个git服务器): // ~/.ssh/下没有id_rsa和id_rsa.pub的话生成一个 ssh-keygen -t rsa -C "youremail@example.com" // 登录github设置公钥 Sittings -> SSH and GPG keys -> New SSH key -> title and public_key // github创建仓库 +(create new...) -> New repository -> Repository name 、Description -> Create repository // 关联github远程仓库 git remote add 源名称(随意填写,一般填origin) git@servername:username/repositoryname.git git remote add origin git@github.com:txf19870527/test.git // 将本地仓库推送到远程,实际上是把当前分支master推送到远程 // -u 会将本地master分支推送到远程的master分支,并将本地master与远程master关联 git push -u origin master # 分支管理 // 创建dev分支 git branch dev // 切换到dev分支 git checkout dev // 创建dev分支并切换到dev分支 git checkout -b dev // 查看分支情况(列出所有分支,当前分支前有*) git branch // 合并分支(在master分支上) git merge dev // 删除分支 git branch -d dev // 没合并过的分支删除时,需要使用-D强制删除 git branch -D dev // 解决冲突(手动解决) Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容 // 查看冲突文件 git status // 查看分支合并图 git log --graph // git默认会用Fast forward模式合并分支(不冲突的情况下),但是这种模式在删除分支后,会丢掉分支信息 // 可以使用 --no-ff 禁用Fast forward (普通模式合并分支会产生新的提交所以要加上-m) git merge --no-ff -m "merge << dev" dev // 假设你在dev分支开发的一半,此时的内容还不能提交,会干扰到其他同事,但是你手上有一个紧急BUG需要修复 // 保存当前工作区(保留现场) git stash // 查看保存情况 git stash list // 恢复现场 git stash apply // 删除stash git stash drop // 恢复并删除stash git stash pop # 多人协作 // 查看远程仓库信息,通常默认:origin -v显示详细信息 git remote -v // 推送分支 不是第一次推送的话,不需要-u参数了 git push origin <branch_name> // 抓取分支 (git clone后默认只能看到本地的master分支) git clone ... // 创建远程dev分支到本地 git checkout -b dev origin/dev // 指定本地dev和远程dev的链接 git branch --set-upstream dev origin/dev // 拉取远程分支,如果存在冲突,跟上面一样(手动解决) $ git pull # 标签管理 // 创建tag git tag v1.0 // 查看所有tag git tag // 在历史提交点上打tag 查看到 commit id 后 git tag git log --pretty=oneline --abbrev-commit git tag v0.9 <your_commit_id> // 查看指定标签信息 git show v1.0 // 创建tag 并设置备注 增加-s参数可以使用PGP签名(不详述) git tag -a v1.1 -m "2016-08-03.1" // 删除标签 git tag -d v1.0 // 推送标签到远程 git push origin <tagname> // 一次性推送全部尚未推送的本地标签 git push origin --tags // 删除远程标签 (先删除本地标签,再远程删除) git tag -d v1.1 git push origin :refs/tags/v1.1 # github使用 // 先fork指定仓库到自己的账号下(否则没有推送权限) // git clone到本地 -> 修改代码 -> push到自己的账号 -> pull request给源仓库 # 忽略不需要提交的文件 规则可参考https://github.com/github/gitignore /* vim .gitignore #忽略后缀名为.o和.a的文件 *.[oa] #但不忽略test.o !test.o #忽略名称为main.txt的文件 main.txt #忽略vendor目录下的所有文件 vendor/ #忽略根目录下的vendor目录下的所有文件 /vendor/ #仅仅忽略项目根目录下的 TODO 文件 不包括 subdir/TODO /TODO #忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/*.txt */ // 如果你在提交指定文件时,提示被git忽略了 // 检查.gitignore中哪处将其忽略 git check-ignore -v README.md // 使用-f参数强制提交 git add -f README.md # 配置别名 // 不加--global针对当前仓库(.git/config) 加上--global针对当前用户(~/.gitconfig) git config --global alias.st status # 搭建git服务器 // 安装git(一般默认安装了) sudo apt-get install git // 创建git用户 sudo adduser git // 设置密码 passwd git // 填写需要远程推送的用户的公钥,一行一个(人多的话可以用Gitosis来管理公钥) vim /home/git/.ssh/authorized_keys // 在/srv目录下创建一个裸仓库 mkdir test.git git init --bare test.git // 设置git用户的权限 chown -R git:git test.git // 禁用git用户的shell登录权限(出于安全考虑) vim /etc/passwd // 将类似下面这行 git:x:1001:1001:,,,:/home/git:/bin/bash // 改为类似下面这行 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell // 将空仓库clone到client就能push pull了 git clone git@192.168.22.228:/srv/test.git # 翻墙 vim ~/.ssh/config Host github.com HostName github.com User txf19870527 IdentityFile ~/.ssh/id_rsa ProxyCommand nc -x localhost:1080 %h %p |