git 常用命令使用实践总结-wish

来源:互联网 发布:mac ppt动画顺序调整 编辑:程序博客网 时间:2024/06/06 07:49
关于GIT:
git是一个开源分布式版本控制系统:
客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。

git优点:
速度快、设计简单对非线性开发模式的强力支持(允许上千个并行开发的分支)完全分布式、有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)。

Git 和其他版本控制系统的主要差别:
Git只关心文件数据的整体是否发生变化,每次计算整体数据的SHA1值是否有变化,再来确定整体状态有无更新变化。而大多数其他系统则只关心文件内容的具体差异(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。


1、首先附上本地wish-openstack git 代码源地址:

git clone git@192.168.1.175:openstack/horizon-2014-1-1.git

git clone git@192.168.1.175:openstack/nova-2014-1-1.git

git clone git@192.168.1.175:openstack/python-novaclient-2-17-0.git

git clone git@wishi.gitlab.com:openstack/keystone-2014-2-b1.git

git clone git@wishi.gitlab.com:openstack/python-keystoneclient-0-9-0.git

git clone git@wishi.gitlab.com:openstack/ceilometer-2014-1-1.git

git clone git@wishi.gitlab.com:openstack/python-neutronclient-2-3-4.git

git clone git@wishi.gitlab.com:openstack/python-glanceclient-0-12-0.git

git clone git@wishi.gitlab.com:openstack/neutron-2014-1-1.git

git clone git@wishi.gitlab.com:openstack/glance-2014-2-b1.git

git clone git@wishi.gitlab.com:openstack/unitelog.git

注:使用账户密码方式:(pwd:yjs)
git clone -b dev git@wishi.gitlab.com:/var/opt/gitlab/git-data/repositories/openstack/nova-2014-1-1.git nova-2014-1-1-dev


2、git 已经存在master主分支情况下,新建dev开发分支及使用:(以nova为例)

1、将nova代码clone到本地:
git clone git@wishi.gitlab.com:openstack/nova-2014-1-1.git

2、进入nova文件夹,新建分支:
cd nova-2014-1-1
git branch dev (默认此dev父分支为当前分支) 


从某个tag处创建分支:
git branch <branch_name>  <tag_name>

3、 查看所有分支,检测分支是否创建成功
git branch -a

4、将本地新建的分支push到远端代码库:
git push origin dev

5、如果需要clone 开发分支代码,使用如下命令:
git clone -b dev git@wishi.gitlab.com:openstack/nova-2014-1-1.git

6、开发分支提交代码,使用如下命令:
git add .  
git commit -m "test commit"  
git push origin dev

备注,以后所有的代码开发都只能在dev分支上面,master只能保存发布版本合并代码


3、删除git分支:
删除本地分支:
git branch -d you_branch_name(强制删除用-D)

删除远程分支:
git push origin :you_branch_name 

举例删除nova 远程的dev分支



4、强行用远程代码覆盖本地:


方法1:
git 放弃本地修改 强制更新
git fetch --all git reset --hard origin/master

git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本(git pull 则会将远程代码合并进本地库)




5、回到初始状态:假若初始建立了一个初始的空commit,之后就可以通过重新设置来清空一个分支,然后使用hard重置分支到刚刚创建的初始commit:
git reset --hard <initial_commit SHA1 值>



6、git打tag方法:
命令的tag打法:
git tag -a v1.0.0-t1 -m "the v1.0.0 tag" 
git push origin v1.0.0-t1
git push origin --tags //一次性推送所有标签

图形(git图形gitlab:https://about.gitlab.com/)



7、为之前提交记录补打tag:
首先用git log -2得到commit 的SHA1值
然后git tag v-test-after-tag  4640383fde2566fcbf04e6e64acc6bd68af01e8c



8、查看分支:

-a参数可以查看远程分支,当前分支前面加有*号标记,远程分支会用红色表示出来(如果你开了颜色支持的话):

1
2
3
4
5
6
7
8
9
10
# git branch -a
  master
  remote
  tungway
  v1.52
* zrong
  remotes/origin/master
  remotes/origin/tungway
  remotes/origin/v1.52
  remotes/origin/zrong

9、删除远程分支及tag:

在Git v1.7.0 之后,可以使用这种语法删除远程分支:

1
git push origin --delete <branchName>

删除tag这么用:

1
git push origin --delete tag <tagname>


否则,可以使用这种语法,推送一个空分支到远程分支,其实就相当于删除远程分支:

1
git push origin :<branchName>

这是删除tag的方法,推送一个空tag到远程tag:

1
2
git tag -d <tagname>
git push origin :refs/tags/<tagname>

两种语法作用完全相同。




10、根据tag得到SHA1值:
git show 2014.1.1




11、重新编辑上一次已经被commit的文件信息:(重新编辑上一次commit的注释等)
git commit --amend


12、已经通过git add 加入到暂存区的文件,撤销回来:
git reset HEAD <file-name>


13、取消对文件的修改
git checkout -- <file>


14、查看当前的远程库
git remote -v
至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库



15:添加及操作远程仓库
$ git remote  (查看)
origin              (显示只有一个origin分支)
$ git remote add pb git://github.com/paulboone/ticgit.git (添加一个远程分支pb)
$ git remote -v (再次查看)
origin git://github.com/schacon/ticgit.git
pb git://github.com/paulboone/ticgit.git

现在可以用字串 pb 指代对应的仓库地址了。比如说,要抓取所有 pb有的,但本地仓库没有的信息,可以运行 git fetch pb:

$ git fetch pb
remote: Counting objects: 58, done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 44 (delta 24), reused 1 (delta 0)
Unpacking objects: 100% (44/44), done.
From git://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit

fetch 、pull区别:
fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。该命令其实相当于git fetch 和 git merge


16、远程仓库的删除和重命名
git remote rename pb paul
git remote rm paul



17、推送数据到远程仓库
git push [remote-name] [branch-name]
也可以:git push [远程名] [本地分支]:[远程分支](显式指定本地分支)



18、分支合并(将dev分支合并到master分支)
git checkout master
git merge dev

假若合并有冲突则用git status查看冲突文件,
手动解决完冲突之后,使用git add 则将冲突文件标注为已解决冲突,
并加入到暂存目录中等待commit

git branch --merged  //查看哪些分支已经与当前分支合并了

git branch --no-merged //查看哪些分支还没有与当前分支合并了


19、分支整合
方法一: merge(合并) 
最容易的整合分支的方法是 merge 命令,它会把两个分支最新的快照以及二者最新的共同祖先进行三方合并


方法二: rebase(衍合)
把在一个分支里提交的改变在另一个分支里重放一遍。

ex:
git rebase --onto master server client
这基本上等于在说“检出 client 分支,找出 client 分支和 server 分支的共同祖先之后的变化,然后把它
们在 master 上重演一遍”
永远不要衍合那些已经推送到公共仓库的更新。

在衍合的时候,实际上抛弃了一些现存的 commit 而创造了一些类似但不同的新 commit。如果你把commit
推送到某处然后其他人下载并在其基础上工作,然后你用 git rebase 重写了这些commit 再推送一次,你的合
作者就不得不重新合并他们的工作,这样当你再次从他们那里获取内容的时候事情就会变得一团糟。





20、git发布版本归档:
 git archive -o last.zip HEAD  基于最新提交建立归档文件last.zip


22、所有可从dev分支中获得而不能从master分支中获得的提交
git log master..dev


23、git本地回滚,及远程回滚

本地回滚:

git reset --hard commit-id :回滚到commit-id,将commit-id之后提交的commit都去除

git reset --hard HEAD~3:将最近3次的提交回滚


远程回滚:(原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支

git checkout branch_name

git pull

git branch branch_backup //备份一下这个分支当前的情况

git reset --hard commit_id //将branch_name本地回滚到commit_id

git push origin :branch_name //删除远程 branch_name分支

git push origin branch_name //用回滚后的本地分支重新建立远程分支

git push origin :branch_backup //如果前面都成功了,删除这个备份分支




24、git误操作,如何查找误操作的commit-id
git reflog


25、
$git config --global core.autocrlf true# Configure Git on Windows to properly handle line endings
解释:core.autocrlf是git中负责处理line endings的变量,可以设置三个值--true,inout,false.

设置成三个值会有什么效果呢?

If core.autocrlf is set to true, that means that any time you add a file to the git repo that git thinks is a text file, it will turn all CRLF line endings to just LF before it stores it in the commit.。

设置为true,添加文件到git仓库时,git将其视为文本文件。他将把crlf变成lf。【2】

If core.autocrlf is set to false, no line-ending conversion is ever performed, so text files are checked in as-is. This usually works ok。【2】

设置为false时,line-endings将不做转换操作。文本文件保持原来的样子。

设置为input时,添加文件git仓库石,git把crlf编程lf。当有人Check代码时还是lf方式。因此在window操作系统下,不要使用这个设置。 

这是参考文献2给的解释希望能帮助大家。 

Yet another way to show how autocrlf works

1) true:             x -> LF -> CRLF2) input:            x -> LF -> LF3) false:            x -> x -> x

where x is either CRLF (windows-style) or LF (unix-style) and arrows stand for

file to commit -> repository -> checked out file


初始化,创建git代码库:(test.git先在远程创建好(gitlab页面)
– Edit
Git global setup:
git config --global user.name "tantexian" git config --global user.email "tantexian@163.com"
Create Repository
mkdir test cd test git init touch README git add README git commit -m 'first commit' git remote add origin git@wishi.gitlab.com:tantexian/test.git git push -u origin master
Existing Git Repo?
cd existing_git_repo git remote add origin git@wishi.gitlab.com:tantexian/test.git git push -u origin master








0 0