工作区—(add)—>暂存区—(commit)—>本地仓库—(push)—>远程仓库
远程仓库—(clone、pull、fetch)—>本地仓库—(reset)—>暂存库—(reset)—>工作区
把一个项目提交到码云上
方式一:(推荐)
在码云上创建一个空的远程仓库
将远程仓库克隆到本地(git clone url)
在本地仓库增添内容
将工作区的内容添加到暂存区(git add .)
将暂存区中的内容提交到本地仓库(git commit -m "说明")
将本地仓库中的内容推送到远程仓库(git push origin master)
方式二:
在本地初始化仓库(git init)
向本地仓库增添内容
将工作区的内容增添到暂存区(git add .)
将暂存区中的内容提交到本地仓库(git commit -m "提交说明")
在码云上新建一个空仓库
本地仓库和远程仓库建立联系(git remote add origin 网址)
将本地仓库的内容推送到远程仓库(git push origin master)
1.git status 状态
2."git add <file>..." 更新要提交的内容
3."git checkout -- <file>..." 丢弃工作区的改动
4.git log 打出git 更新的log
5.git reset --soft ... 重置软件
6.git reset --hard ... 重置硬件
7.git stash list 显示进度列表。此命令显然暗示了git stash 可以多次保存工作进度,并用在恢复时候 选择。
8.git stash 保存当前的工作进度。会分别对暂存区和工作区的状态进行保存。
9.git pull --rebase 更新本地分支
是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势。
Git常用操作命令:
1) 远程仓库相关命令
检出仓库:$ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url --push [name] [newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]
*如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$git push origin test:master // 提交本地test分支作为远程的master分支
$git push origin test:test // 提交本地test分支作为远程的test分支
2)分支(branch)操作相关命令
查看本地分支:$ git branch
查看远程分支:$ git branch -r
创建本地分支:$ git branch [name] ----注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
删除分支:$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] ----将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name] 或 $ gitpush origin :[name]
*创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
$git symbolic-ref HEAD refs/heads/[name]
$rm .git/index
$git clean -fdx
3)版本(tag)操作相关命令
查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]
合并远程仓库的tag到本地:$ git pull origin --tags
上传本地tag到远程仓库:$ git push origin --tags
创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
4) 子模块(submodule)相关操作命令
添加子模块:$ git submodule add [url] [path]
如:$git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模块:$ git submodule init ----只在首次检出仓库时运行一次就行
更新子模块:$ git submodule update ----每次更新或切换分支后都需要运行一下
删除子模块:(分4步走哦)
1) $ git rm --cached [path]
2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
3) 编辑“ .git/config”文件,将子模块的相关配置节点删除掉
4) 手动删除子模块残留的目录
5)忽略一些文件、文件夹不提交
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db
=====================
Git 常用命令
git branch 查看本地所有分支
git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看本地所有分支git commit -am "init" 提交并且加注释 git remote add origin git@192.168.1.119:ndshowgit push origin master 将文件给推到服务器上 git remote show origin 显示远程库origin里的资源 git push origin master:developgit push origin master:hb-dev 将本地库与服务器上的库进行关联 git checkout --track origin/dev 切换到远程dev分支git branch -D master develop 删除本地库developgit checkout -b dev 建立一个新的本地分支devgit merge origin/dev 将分支dev与当前分支进行合并git checkout dev 切换到本地dev分支git remote show 查看远程库git add .git rm 文件名(包括路径) 从git中删除指定文件git clone git://github.com/schacon/grit.git 从服务器上将代码给拉下来git config --list 看所有用户git ls-files 看已经被提交的git rm [file name] 删除一个文件git commit -a 提交当前repos的所有的改变git add [file name] 添加一个文件到git indexgit commit -v 当你用-v参数的时候可以看commit的差异git commit -m "This is the message describing the commit" 添加commit信息git commit -a -a是代表add,把所有的change加到git index里然后再commitgit commit -a -v 一般提交命令git log 看你commit的日志git diff 查看尚未暂存的更新git rm a.a 移除文件(从暂存区和工作区中删除)git rm --cached a.a 移除文件(只从暂存区中删除)git commit -m "remove" 移除文件(从Git中删除)git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)git diff --cached 或 $ git diff --staged 查看尚未提交的更新git stash push 将文件给push到一个临时空间中git stash pop 将文件从临时空间pop下来---------------------------------------------------------git remote add origin git@github.com:username/Hello-World.gitgit push origin master 将本地项目给提交到服务器中-----------------------------------------------------------git pull 本地与服务器端同步-----------------------------------------------------------------git push (远程仓库名) (分支名) 将本地分支推送到服务器上去。git push origin serverfix:awesomebranch------------------------------------------------------------------git fetch 相当于是从远程获取最新版本到本地,不会自动mergegit commit -a -m "log_message" (-a是提交所有改动,-m是加入log信息) 本地修改同步至服务器端 :git branch branch_0.1 master 从主分支master创建branch_0.1分支git branch -m branch_0.1 branch_1.0 将branch_0.1重命名为branch_1.0git checkout branch_1.0/master 切换到branch_1.0/master分支du -hs-----------------------------------------------------------mkdir WebAppcd WebAppgit inittouch READMEgit add READMEgit commit -m 'first commit'git remote add origin git@github.com:daixu/WebApp.gitgit push -u origin master
Git的版本管理
清空暂存区(git rm --cache 文件名)
查看历史(过去的)版本(git log)
查看所有(过去的和未来的)版本和操作记录(git reflog)
回到某个版本(git reset)git reset --hard 版本号 回退到某个版本
git reset --soft 版本号 回退到某个版本,把未来文件放在暂存区
git reset --mixed 版本号 回退到某个版本,把未来文件放在工作区
给当前版本添加轻量级的版本标签(git tag 标签号)
给历史版本添加轻量级的版本标签(git tag 标签号 版本号)
添加有备注的版本标签(git tag -a 标签号 -m "备注")
查看标签(git tag)
显示标签详细信息(git show 标签号)
删除标签(git tag -d 要删除的标签号)
对比版本之间的差异(git diff 前版本号 (标签号) 后版本号 (标签号))
将本地仓库某一个标签推到远程仓库(git push origin 标签号)
将本地仓库所有标签推到远程仓库(git push origin --tag)
删除标签,先删除本地仓库的标签,再删除远程仓库标签(git push origin :refs/tags/版本号)
团队合作
-
集中式方式(和 SVN 类似)
步骤:
-
负责人将团队成员添加项目开发者
-
团队成员开发项目推送到远程仓库
-
在提交之前要先从远程仓库拉取最新的提交(git pull)
-
解决冲突提交到远程仓库(git add . git rebase --continue)
-
再次推送到远程仓库
-
-
fork + Pull Requests 方式(推荐的方式)
步骤:
- 每个人 fork 中央仓库项目
- 推送到自己 fork 过的远程仓库(git remote add upstream 中央仓库的地址)
- 拉取中央仓库的更新(git pull upstream master)
- 完成某个功能发起 Pull Requests
- 中央仓库所有者合并我们的 Pull Requests
Git全局设置
git config --global user.name "***"
git config --global user.email "***@***.com"
查看配置
git config --list
创建一个本地仓库
git init
克隆github上现有的仓库
git clone [url] 可以在克隆仓库的时候自定义本地仓库的名字 git clone [url] name
检查当前文件状态
git status
使用 git status -s 命令或 git status --short 命令,将得到一种更为紧凑的格式输出。新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。
创建一个新的文件
touch newfile.txt 或者使用 vim newfile.txt(详细指令见linux)
echo 'My Project' >> newfile.txt 编辑文件
cat newfile.txt 查看文件
此时再次使用git status 命令能够看到一个未跟踪文件,需要使用git add命令将其纳入跟踪范围
将工作区内容添加到暂存区进行跟踪
git add newfile
查看尚未暂存的文件更新了哪些部分
git diff
查看已暂存的文件将要添加到下次提交中的内容
git diff --staged 或 git diff --cachedd
提交更新(将暂存区的内容添加到本地仓库)
git commit
提交更新时添加说明
git commit -m "added a new file named newfile"
强制提交更新
git commit -a
移除文件
如果只是手动或者在命令行使用rm从工作目录中删除文件,运行git status会发现该文件出现在未暂存清单。要从 git 中彻底移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
git rm newfile
git commit -m "delete newfile"
如果删除之前修改过并且已经放到暂存区域,但并没有提交,则必须要用强制删除选项 -f
git rm -f newfile
如果想把文件从 git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中(想让文件保留在磁盘,但是并不想让 git 继续跟踪)这时可以使用--cached
git rm --cached newfile
git rm
命令后面可以列出文件或者目录的名字,也可以使用glob模式(glob 模式是指 shell 所使用的简化了的正则表达式,也被称之为 shell 通配符)比如:
git rm log/\*.log 此命令删除 log/
目录下扩展名为 .log
的所有文件。
移动文件(常用来重命名)
git mv oldname newname
查看提交历史
git log 按提交时间列出所有的更新
git log --oneline 显示成一行
git log --graph 显示成树形
git log -p -2 -p
用来显示每次提交的内容差异, -2用
来仅显示最近两次提交
git log --stat 列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加
git log --pretty=**** 指定使用不同于默认格式的方式展示提交历史,还可以利用format选项定制显示的格式,eg:git log --pretty=format:"%h - %an,%ar:%s" 还可以与--graph联用,显示ASCLL图形表示的分支合并历史。
撤销操作
git commit --amend
重新提交前一次的提交,如果前一次提交有任何遗漏(少提交了几个文件,文件内内容有误,提交说明写错了等),你可以随时进行弥补或者更正,然后重新提交。这样会覆盖前一次提交的记录,但前一次的提交时间会保留。重新提交时,提交信息编辑器中可以看到上次的提交说明,可以编辑覆盖。
git reset HEAD <file> 取消暂存的文件
git checkout -- <file> 撤销对文件的修改
远程仓库的使用
git remote 查看远程仓库
git remote -v 显示需要读写远程仓库使用的Git保存的简写与其对应的URL
git remote add <shortname> <url> 将本地仓库与远程仓库建立联系,同时指定一个简写(shortname是的简写,作为远程仓库的名字)
git fetch 远程仓库名 访问远程仓库,从中拉取所有你没有的数据。执行完成后你将拥有哪个远程仓库所有的分支引用,但不会自动合并或修改你当前的工作,必须手动合并
git push 远程仓库名 分支名 将本地仓库中的文件推送到远程仓库
git remote show origin 查看某个远程仓库的更多信息
git remote rm username2 远程仓库的移除
git remote rename username2 newname 远程仓库的重命名
打标签
git tag 列出标签
git tag -l 'v1.8.5*' 使用特定模式查找标签
创建标签:git使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)
清量标签只是一个特定提交的引用,本质上是将提交校验和存储到一个文件中 - 没有保存任何其他信息。
附注标签:存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签。
附注标签(运行 tag
命令时指定 -a
选项)
git tag -a 标签号 -m "备注"
轻量标签(运行tag命令时不指定任何选项)
git tag 标签号
查看标签信息与对应的提交信息
git show 标签号
为历史提交打标签
git tag -a 标签号 版本号 -m "备注"
共享标签(推送标签到共享服务器)
git push origin 标签号
一次性推送多个标签(将所有不再远程服务器上的标签全部传送)
git push origin --tags
Git分支
Git默认分支(主分支)名字时master
分支创建
git branch testing git branch命令仅仅创建一个新分支,不会自动切换到新分支
分支切换
git有一个名为 HEAD
的特殊指针,指向当前所在的本地分支(项目默认初始分支为master,所以HEAD一开始是指向master分支的)
使用 git log
命令查看各个分支当前所指的对象。 提供这一功能的参数是--decorate
git log --oneline --decorate
切换到一个已存在的分支,使用 git checkout
命令
git checkout testing 这样HEAD就指向testing分支了
利用checkout新建分支的同时切换到该分支
git checkout -b testing2
过HEAD指针切换不同的分支工作,项目就会产生分叉,使用 git log
命令查看分叉历史。
git log --oneline --decorate --graph --all 输出提交历史,各个分支指向以及项目的分支分叉情况
查看分支
查看本地分支
git branch
查看所有分支(包括远程分支)
git branch -a
查看本地分支最后一次提交
git branch -v
合并分支
当我们在新建的工作分支上修复了bug或者加入了新的内容时,可以将其合并到主分支上,首先切换到主分支,然后利用git merge命令进行合并。
git checkout master
git merge testing
删除分支
git branch -d testing
克隆指定分支
git clone -b testing <url>
删除远程分支
git push --delete origin testing
重命名本地分支
git branch -m testing newtest
解决本地仓库与远程仓库不一致问题
pull远程仓库
git pull origin
和本地仓库合并
git merge origin master
提交
git push origin master