• git使用基本教程


    1. windows上配置github

    git config --global user.name "name"
    git config --global user.email "email@example.com"

    2. 设置版本库存放目录
    mkdir learngit
    pwd命令用于显示当前目录

    3. 通过git init命令把这个目录变成Git可以管理的仓库:
    git init
    如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

    4. 用命令git add告诉Git,把文件添加到仓库
    git add readme.txt
    使用命令git add <file>,注意,可反复多次使用,添加多个文件。

    5. 用命令git commit告诉Git,把文件提交到仓库:
    git commit -m "wrote a readme file"
    git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
    commit可以一次提交很多文件,所以你可以多次add不同的文件。

    6. git status查看库中的更改的文件,可以让我们时刻掌握仓库当前的状态。

    7. git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式。

    8. git log命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数。
    git log --pretty=oneline

    9. 在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,
    当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
    git reset --hard HEAD^ 回退到上一个版本
    git reset --hard commitid 如 git reset --hard cca90f6655939aa114d3d36932172b885743c283

    10. Git提供了一个命令git reflog用来记录你的每一次命令。

    11. git checkout -- file可以丢弃工作区的修改,未git add。

    12. git reset HEAD file可以把暂存区(git add后)的修改撤销掉(unstage),重新放回工作区。
    git reset HEAD readme.txt

    13. 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了: rm test.txt
    现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit;
    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:$ git checkout -- test.txt
    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

    14. 创建SSH Key。
    ssh-keygen -t rsa -C "youremail@example.com"
    如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,
    id_rsa.pub是公钥,可以放心地告诉任何人。登陆GitHub,打开“Account settings”,“SSH Keys”页面;然后,点“Add SSH Key”,填上任意Title,在Key文
    本框里粘贴id_rsa.pub文件的内容。

    15. 登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库;在GitHub上的这个仓库还是空的,GitHub告诉我们,可以从这个仓库克隆
    出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
    本地仓库关联远程库:git remote add origin git@github.com:username/learngit.git
    把本地库的mater分支的所有内容推送到远程库上:git push -u origin master
    把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,
    Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
    此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

    16. 从远程库克隆:$ git clone git@github.com:uearname/reponame.git.
    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

    17. 创建dev分支,然后切换到dev分支: $ git checkout -b dev
    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
    $ git branch dev
    $ git checkout dev

    18. 用git branch命令查看当前分支:
    git branch
    git branch命令会列出所有分支,当前分支前面会标一个*号。

    19. dev分支的工作完成,我们就可以切换回master分支:
    git checkout master
    切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变.

    14. 我们把dev分支的工作成果合并到master分支上:
    git merge dev
    git merge命令用于合并指定分支到当前分支。注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,
    所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会将其他方式的合并。

    15. 合并完成后,就可以放心地删除dev分支了:
    git branch -d dev
    因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    16. git log --graph --pretty=oneline --abbrev-commit 命令可以看到分支合并图。

    17. 准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:git merge --no-ff -m "merge with no-ff" dev

    分支策略
    在实际开发中,我们应该按照几个基本原则进行分支管理:
    首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

    18. 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

    git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作,
    用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

    git stash list 用git stash list命令查看Git把stash内容存在什么地方;
    恢复工作区:一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    另一种方式是用git stash pop,恢复的同时把stash内容也删了。

    19. 要查看远程库的信息,用git remote;
    或者,用git remote -v显示更详细的信息.

    20. 开发一个新feature,最好新建一个分支。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

    21. 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:$ git push origin master
    如果要推送其他分支,比如dev,就改成:$ git push origin dev
    但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
    master分支是主分支,因此要时刻与远程同步;
    dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
    bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
    feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
    总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!

    22. 多人协作时,大家都会往master和dev分支上推送各自的修改。
    现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆:$ git clone git@github.com:username/learngit.git
    当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看:$ git branch
    现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:$ git checkout -b dev origin/dev
    现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:$ git commit -m "add /usr/bin/env"
    $ git push origin dev

    23. 你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送;推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,
    解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送;
    $ git pull
    git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
    $ git branch --set-upstream dev origin/dev
    再pull:
    $ git pull
    这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:
    $ git commit -m "merge & fix hello.py"
    $ git push origin dev

    24. 因此,多人协作的工作模式通常是这样:
    首先,可以试图用git push origin branch-name推送自己的修改;
    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    如果合并有冲突,则解决冲突,并在本地提交;
    没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

    25. 创建标签:
    在Git中打标签非常简单,首先,切换到需要打标签的分支上:
    $ git branch
    $ git checkout master
    然后,敲命令git tag <name>就可以打一个新标签:
    $ git tag v1.0
    可以用命令git tag查看所有标签:
    $ git tag
    默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
    方法是找到历史提交的commit id,然后打上就可以了:
    $ git log --pretty=oneline --abbrev-commit
    $ git tag v0.9 6224937
    注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:
    $ git show v0.9
    还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
    $ git tag -a v0.1 -m "version 0.1 released" 3628164
    用命令git show <tagname>可以看到说明文字:
    $ git show v0.1
    还可以通过-s用私钥签名一个标签:
    $ git tag -s v0.2 -m "signed version 0.2 released" fec145a
    签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错:如果报错,请参考GnuPG帮助文档配置Key。
    用命令git show <tagname>可以看到PGP签名信息:
    $ git show v0.2
    如果标签打错了,也可以删除:因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
    $ git tag -d v0.1
    如果要推送某个标签到远程,使用命令git push origin <tagname>:
    $ git push origin v1.0
    或者,一次性推送全部尚未推送到远程的本地标签:
    $ git push origin --tags
    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
    $ git tag -d v0.9
    然后,从远程删除。删除命令也是push,但是格式如下:
    $ git push origin :refs/tags/v0.9
    要看看是否真的从远程库删除了标签,可以登陆GitHub查看。

    26. 忽略文件的原则是:
    忽略操作系统自动生成的文件,比如缩略图等;
    忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
    例如:
    # Windows:
    Thumbs.db
    ehthumbs.db
    Desktop.ini

    # Python:
    *.py[cod]
    *.so
    *.egg
    *.egg-info
    dist
    build

    # My configurations:
    db.ini
    deploy_key_rsa
    最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。
    使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就
    可以把文件保存为.gitignore了。

    27. 配置别名
    如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。
    $ git config --global alias.st status
    当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:
    $ git config --global alias.co checkout
    $ git config --global alias.ci commit
    $ git config --global alias.br branch
    --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
    命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名:
    $ git config --global alias.unstage 'reset HEAD'
    配置一个git last,让其显示最后一次提交信息:
    $ 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"

    28. 配置文件
    配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
    每个仓库的Git配置文件都放在.git/config文件中:
    $ cat .git/config
    别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
    而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
    $ cat .gitconfig
    配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。

    29. 搭建Git服务器
    搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。假设你已经有sudo权限的用户账号,下面,正式开始安装。
    第一步,安装git:
    $ sudo apt-get install git
    第二步,创建一个git用户,用来运行git服务:
    $ sudo adduser git
    第三步,创建证书登录:
    收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
    第四步,初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
    $ sudo git init --bare sample.git
    Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都
    以.git结尾。然后,把owner改为git:
    $ sudo chown -R git:git sample.git
    第五步,禁用shell登录:
    出于安全考虑,第二步创建的git用户不允许登录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,因为我们为git用户指定的git-shell每次一登录就自动退出。
    第六步,克隆远程仓库:
    现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
    $ git clone git@server:/srv/sample.git
    Cloning into 'sample'...
    warning: You appear to have cloned an empty repository.

    30. 管理公钥
    如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,
    这时,可以用Gitosis来管理公钥。

    31. 管理权限
    有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。
    因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列
    脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。

    32. 常用的.gitignore

    # java.gitignore
    *.class

    # Mobile Tools for Java (J2ME)
    .mtj.tmp/

    # Package Files #
    *.jar
    *.war
    *.ear

    # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
    hs_err_pid*

    # c++.gitignore
    # Compiled Object files
    *.slo
    *.lo
    *.o
    *.obj

    # Precompiled Headers
    *.gch
    *.pch

    # Compiled Dynamic libraries
    *.so
    *.dylib
    *.dll

    # Fortran module files
    *.mod

    # Compiled Static libraries
    *.lai
    *.la
    *.a
    *.lib

    # Executables
    *.exe
    *.out
    *.app

    # c.gitignore
    # Object files
    *.o
    *.ko
    *.obj
    *.elf

    # Precompiled Headers
    *.gch
    *.pch

    # Libraries
    *.lib
    *.a
    *.la
    *.lo

    # Shared objects (inc. Windows DLLs)
    *.dll
    *.so
    *.so.*
    *.dylib

    # Executables
    *.exe
    *.out
    *.app
    *.i*86
    *.x86_64
    *.hex

    # Debug files
    *.dSYM/

    #python.gitignore
    # Byte-compiled / optimized / DLL files
    __pycache__/
    *.py[cod]
    *$py.class

    # C extensions
    *.so

    # Distribution / packaging
    .Python
    env/
    build/
    develop-eggs/
    dist/
    downloads/
    eggs/
    .eggs/
    lib/
    lib64/
    parts/
    sdist/
    var/
    *.egg-info/
    .installed.cfg
    *.egg

    # PyInstaller
    # Usually these files are written by a python script from a template
    # before PyInstaller builds the exe, so as to inject date/other infos into it.
    *.manifest
    *.spec

    # Installer logs
    pip-log.txt
    pip-delete-this-directory.txt

    # Unit test / coverage reports
    htmlcov/
    .tox/
    .coverage
    .coverage.*
    .cache
    nosetests.xml
    coverage.xml
    *,cover
    .hypothesis/

    # Translations
    *.mo
    *.pot

    # Django stuff:
    *.log

    # Sphinx documentation
    docs/_build/

    # PyBuilder
    target/

    #QT.gitignore
    # C++ objects and libs

    *.slo
    *.lo
    *.o
    *.a
    *.la
    *.lai
    *.so
    *.dll
    *.dylib

    # Qt-es

    /.qmake.cache
    /.qmake.stash
    *.pro.user
    *.pro.user.*
    *.qbs.user
    *.qbs.user.*
    *.moc
    moc_*.cpp
    qrc_*.cpp
    ui_*.h
    Makefile*
    *-build-*

    # QtCreator

    *.autosave

    #QtCtreator Qml
    *.qmlproject.user
    *.qmlproject.user.*

    #Ruby.gitignore
    *.gem
    *.rbc
    /.config
    /coverage/
    /InstalledFiles
    /pkg/
    /spec/reports/
    /spec/examples.txt
    /test/tmp/
    /test/version_tmp/
    /tmp/

    ## Specific to RubyMotion:
    .dat*
    .repl_history
    build/

    ## Documentation cache and generated files:
    /.yardoc/
    /_yardoc/
    /doc/
    /rdoc/

    ## Environment normalisation:
    /.bundle/
    /vendor/bundle
    /lib/bundler/man/

    # for a library or gem, you might want to ignore these files since the code is
    # intended to run in multiple environments; otherwise, check them in:
    # Gemfile.lock
    # .ruby-version
    # .ruby-gemset

    # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
    .rvmrc

    #Unity.gitignore
    /[Ll]ibrary/
    /[Tt]emp/
    /[Oo]bj/
    /[Bb]uild/

    # Autogenerated VS/MD solution and project files
    *.csproj
    *.unityproj
    *.sln
    *.suo
    *.tmp
    *.user
    *.userprefs
    *.pidb
    *.booproj

    # Unity3D generated meta files
    *.pidb.meta

    # Unity3D Generated File On Crash Reports
    sysinfo.txt

    #Objective-C.gitignore
    # Xcode
    #
    # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

    ## Build generated
    build/
    DerivedData

    ## Various settings
    *.pbxuser
    !default.pbxuser
    *.mode1v3
    !default.mode1v3
    *.mode2v3
    !default.mode2v3
    *.perspectivev3
    !default.perspectivev3
    xcuserdata

    ## Other
    *.xccheckout
    *.moved-aside
    *.xcuserstate
    *.xcscmblueprint

    ## Obj-C/Swift specific
    *.hmap
    *.ipa

    # CocoaPods
    #
    # We recommend against adding the Pods directory to your .gitignore. However
    # you should judge for yourself, the pros and cons are mentioned at:
    # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
    #
    # Pods/

    # Carthage
    #
    # Add this line if you want to avoid checking in source code from Carthage dependencies.
    # Carthage/Checkouts

    Carthage/Build

    # fastlane
    #
    # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
    # screenshots whenever they are needed.

    fastlane/report.xml
    fastlane/screenshots

    #OracleForms.gitignore
    # Compiled Form Modules
    *.fmx

    # Compiled Menu Modules
    *.mmx

    # Compiled Pre-Linked Libraries
    *.plx

    #Perl.gitignore
    /blib/
    /.build/
    _build/
    cover_db/
    inc/
    Build
    !Build/
    Build.bat
    .last_cover_stats
    /Makefile
    /Makefile.old
    /MANIFEST.bak
    /META.yml
    /META.json
    /MYMETA.*
    nytprof.out
    /pm_to_blib
    *.o
    *.bs
    /_eumm/

    *.gitignore
    *.metadata

  • 相关阅读:
    js弹出文字
    javascript函数的使用
    php笔记-双引号内的变量会被解释,而单引号内的变量则原样输出
    单独编译源码树下的模块
    内核模块开机自动加载和黑名单
    [转]Linux中设置服务自启动的三种方式
    rpm打包
    APC to USB
    [转]创建一个虚拟盘
    编译打印输出重定向
  • 原文地址:https://www.cnblogs.com/neil1112/p/4912526.html
Copyright © 2020-2023  润新知