• Git使用笔记


    linux安装Git

    1.使用yum形式安装,会直接把依赖的包都装上

    # yum install git

    2.使用源码形式安装

    官网地址 http://git-scm.com/

    源码下载地址:https://git-core.googlecode.com/files/git-1.9.0.tar.gz

    源码形式需要调用 curl, zlib, openssl, expat, libiconv等库代码,所以需要先安装这些依赖工具。

    # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

    安装文件下载到指定文件夹后使用如下命令安装

    # tar -xvzf git-1.9.0.tar.gz 

    # cd git-1.9.0

    # ./configure --prefix=/usr/local 

    # make

    # make install

    安装后看看版本

    # git --version

    git version 1.9.0

    初次使用需要配置用户信息,配置个人信息可以针对三种情况,1:针对系统,2:针对当前登录用户,3:针对单个项目。

    当前登录用户配置如下:

    $ git config --global user.name "youname"

    $ git config --global user.email "youname@example.com"

    如果要针对系统则使用 --system, 针对项目则去掉--global选择就可以了

    $ git config -l  # 查看用户配置

    服务器上创建纯仓库,--shared选项是设置该仓库加入到可写的组

    # git init firstproject.git --bare --shared

    进入指定目录后,clone远程仓库代码

    $ git clone ssh://root@192.168.0.126:6022/data/git/firstproject.git

    $ git clone ssh://root@192.168.0.126:6022/data/git/firstproject.git newproject  # 自定义项目名称

    $ git clone --bare ssh://root@192.168.0.106:6022/data/git/teacherapi.git # 克隆纯仓库

    进入到本地项目目录后,右键菜单打开git bash

    $ git init # 初始化git项目

    $ git add .  # 添加到暂存(staged)区域,只处理添加和修改,不处理删除

    $ git add -A 处理所有:添加、修改、删除

    $ git add -u 处理修改和删除,不处理新添加文件

    $ git reset HEAD filename # 取消已暂存的文件

    $ git reset --hard "log_hash" # 强制重置到指定版本,之后提交的文件都会被删除,并且相关提交日志也会跟着删除

    $ git reset "log_hash" # 重置到指定版本,之后提交的日志都会被删除,但是之后提交的文件会恢复到未跟踪状态

    $ git reset HEAD^  # 取消最后一次提交,与git reset "log_hash"效果一样

    $ git revert "log_hash" # 撤销某次操作, 那次添加的文件会被删除,但提交日志不会删除,同时会增加撤销操作执行的日志

    $ git reflog # 查看所有HEAD的历史,reset操作日志会记录到这里,再次使用git reset "reflog_hash"可以恢复已删除的记录

    如果因为reset等操作丢失一个提交的时候,总是可以把它找回来。除非你的操作已经被git当做垃圾处理掉了,一般是30天以后。

    $ git commit -m "initial project version" # 提交到本地仓库

    $ git commit -a -m "commit project" # 不通过暂存区域直接提交已跟踪的文件

    $ git commit --amend # 修改最后一次提交message内容

    $ git checkout -- filename # 取消对文件的修改, 取消后在使用git status 查看状态应该是未修改状态

    # 忽略已跟踪的文件

    $ git rm --cached logs/xx.log (--cached参数表示删除仓库文件同时保留本地文件) 然后更新 .gitignore 忽略掉目标文件,在然后 git commit -m "We really don't want Git to track this anymore!" 最后推送到远程仓库 git push origin master:master

    有的时候工程里面会有很多没有追踪的文件和目录,一个一个地删除太麻烦。 git clean可以帮你批量删除,非常的方便。下面介绍一下git clean的使用:

    $ git clean -n 显示要删除的文件

    $ git clean -dn 显示要删除的文件和目录

    $ git clean -di 进入交互模式

    $ git clean -f 删除未追踪的文件

    $ git clean -dff 删除未追踪的目录

    $ git clean -df 删除未追踪的文件和目录(不包含ignored中文件)

    $ git clean -dxf  # 清除所有未跟踪文件,包括纳入ignored的文件

    远程仓库使用

    $ git remote add origin ssh://root@192.168.0.125:6022/var/git/firstproject.git # 添加远程仓库

    $ git remote rm repository_name # 删除远程仓库

    $ git remote rename old_name new_name  # 修改远程仓库名称

    $ git remote -v # 查看远程仓库信息

    $ git remote show origin # 查看指定远程仓库信息

    $ git push origin master:master or  git push origin master  # 推送到远程分支 语法:git push[远程名] [本地分支]:[远程分支], 克隆操作会自动使用默认的  master 和 origin 名字

    $ git fetch origin master # 从远程仓库抓取数据, 语法:git fetch [remote-name], 注:fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支

    $ git pull origin master # 自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支,如果发生冲突可以使git rebase --abort 终止合并

    $ git fetch origin  # 将远程分支信息获取到本地,某些时候本地想创建分支的时候直接跟踪远程分支,但本地并无远端分支信息,就可以用该命令先获取在跟踪

    $ git mv readme.txt readme # 修改文件名,需要执行commit和push命令才能更新到版本库

    $ git rm *.bak # 删除文件,需要执行commit和push命令才能更新到版本库

    $ git rm --cached log/*.log # 删除仓库文件的同时,保留本地文件

    # 忽略文件,使用vi命令创建一个.gitignore的文件

    # 在pull过程中遇到冲突问题,编辑冲突文件后,使用git add命令重新添加到缓存区后,就可以正常执行git commit命令

    分支使用

    $ git branch hotfix # 创建分支

    $ git checkout hotfix # 切换分支,切换过程中尽量避免存在缓存区文件

    $ git checkout -f develop  # 强制切换分支

    $ git checkout -b branch_name # 创建新分支并切换到新分支

    $ git checkout -b local-branchname origin/remote_branchname  # 获取远程分支的同时创建本地分支

    $ git merge develop  # 这个命令把分支"develop"合并到了当前分支(master)里面, 注意合并前先checkout到master分支

    $ git branch -d hotfix # 删除分支

    $ git branch -D hotfix # 强制删除为未并的分支

    $ git branch # 查看当前分支

    $ git branch -a # 查看所有分支

    $ git branch -r # 查看远程分支

    $ git branch -v # 查看个分支最后一次提交信息

    $ git branch --no-merged # 查看未合并的分支

    $ git push origin hotfix:serverfix # 本地分支hotfix推送到远程分支serverfix,如果远程分支不存在则创建

    $ git checkout -b serverfix origin/serverfix # 获取到本地一份新的远程分支

    $ git checkout --track origin/serverfix # 跟踪分支, 与该语句“git checkout -b serverfix origin/serverfix”效果一样

    $ git push origin :serverfix # 删除远程分支

    $ git push origin --delete develo  # 删除远程分支

    $ git branch -r -d origin/develo   # 删除本地跟踪记录

    $ git remote prune origin   # 清除远程不存在的分支

    $ git remote show origin  # 查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

    如果当前分支已经修改了,这时候正常切换是不允许的,可以使用git stash把修改的文件暂存起来,等切换过来后在使用git stash apply 恢复之前的状态

    提交记录

    $ git log --all # 查看提交日志

    $ git log --author=myname  # 查看指定用户的提交记录

    $ git log --cherry develop  # 查看指定分支提交记录

    合并

    $ git merge hotfix # hotfix代码合并到master分支(相当于在master分支上拉取hotfix分支代码), 注意合并前先checkout到master分支

    $ git merge develop --squash  # 作为一个整体合并到当前分支,不会将develop里面乱七八糟的提交记录更新到当前分支,这相当于copy 操作,所以执行merge后还需要再次commit 。

    $ git merge <commit-id>  # 根据提交记录合并

    $ git merge 合并的时候有冲突解决完 执行git rebase --continue 来继续合并。 

    指定文件合并,例如将bug分支explain_edit.html文件合并到develop分支explain_edit.html,可以这样操作

    $ git checkout develop  # 先切换到develop

    $ cd zhishidian/themes/manager/knowledge/explain  # 进入文件所在文件夹

    $ git checkout bug -- explain_edit.html  # 合并文件,合并后文件处于修改状态,注意--后面有空格。

    标签使用

    $ git tag -a v0.1.2 -m "发布0.1.2版本" # 创建标签

    $ git fetch --tags  # 获取标签

    $ git checkout [tagname] # 切换标签与切换分支命令相同

    $ git show v0.1.2 # 查看标签信息

    $ git tag -d v0.1.2 # 删除标签

    $ git push origin :refs/tags/标签名 

    $ git tag -a v0.1.1 9fbc3d0 # 补打标签,"9fbc3d0"通过git log获取某个提交对象的校验

    $ git push origin v0.1.2 # 将v0.1.2标签提交到git服务器

    $ git push origin v0.1.2:refs/tags/v0.1.2   # 指定标签提交到服务器指定位置

    $ git push origin --tags # 将本地所有标签一次性提交到git服务器

    $ git tag -l or --list  # 查看所有标签

    $ git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags|tail -3  # 按时间倒序取最后3条

    # 也可以这样排序

    git log --tags --decorate --simplify-by-decoration

    git log --tags --simplify-by-decoration --pretty="format:%ai %d"

    其它

    $ git rebase branch_name # 分支变基,已指定分支为基础,把当前分支已经提交的记录在追加到指定更新的分支上,这和当前分支上使用pull other_branch结果是一样的,只是执行过程不一样

    $ git rebase --abort # 终止rebase,如果rebase过程中遇到冲突问题,可以使用--abort参数终止操作,解决冲突后还可以使用--continue继续rebase

    $git show HEAD # 查看当前分支当前的历史状态,HEAD表示当前分支最新版本,HEAD^表示HEAD父母的信息,HEAD~4表示HEAD上溯四代的信息 

    git是不能add空目录的,如果想add空目录的,则需要在目录里面添加一个文件才能正常添加上,这个时候可添加.gitignore文件当一个占位符。

    如果想一个(大)文件永久删除,既不要在版本库历史记录里面看到也不要占用版本库空间的话,可以使用filter-branch,具体用法参考官方文档。

    $ git filter-branch --tree-filter 'rm -f testme.txt' HEAD 

    $ git diff settings.py  # 对比文件修改内容

    总结:

    git里面的文件有以下几种状态

    --未跟踪 (untracked)

    --已跟踪 (tracked)

      --已修改 (modified)

      --已暂存 (staged)

      --已提交 (commited)

      --正常

    拓展知识

    SSH登录使用RSA证书认证代替密码认证

    创建RSA证书

    打开git bash后输入 ssh-keygen -t rsa -C "youname@example.com" 之后会在C:UsersAdministrator.ssh生成两个文件id_rsa,id_rsa.pub,这两个一个是私钥,一个是公钥,创建过程中会提示输入密码,直接忽略就行了。

    把已生成的id_rsa.pub(公钥)上传到linux服务器上后,把该文件内容添加到/root/.ssh/authorized_keys文件中

    可以使用如下命令:

    $ scp ~/.ssh/id_rsa.pub root@192.168.0.124:/tmp/id_rsa3.pub # 使用git bash将本地文件上传到服务器

    # cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys

    使用git bash登录linux服务器

    $ ssh root@192.168.0.126 或 $ ssh -l username remotehost  
    $ ssh root@192.168.0.126 -p6022  # 带端口访问

    退出ssh可以使用exit命令

    git命令自动补全

    $ find / -name git-completion*
    $ cp /usr/share/doc/git-1.8.3.1/contrib/completion/git-completion.bash ~/.git-completion.bash
    $ chmod +x ~/.git-completion.bash # 设置执行权限
    在 .bashrc 中加入下面这行代码,然后执行source ~/.bashrc 使其生效。
    source ~/.git-completion.bash

    这几篇Git文章写的不错

    Git 版本管理工具(一)

    http://blog.csdn.net/ithomer/article/details/7527877

    Git 常用命令详解(二)

    http://blog.csdn.net/ithomer/article/details/7529022

    Git 常用命令速查表(三)

    http://blog.csdn.net/ithomer/article/details/7529841 

    http://rongjih.blog.163.com/blog/static/335744612010112562833316/

  • 相关阅读:
    线程通信---wait notify
    线程安全方式03---Lock锁
    线程安全方式02Runnable---同步方法
    线程安全方式2Runnable---同步代码块
    线程安全方式1Thread类---同步代码块
    线程安全方式1Thread类---同步方法
    线程中的Thread类中的方法
    多线程之创建线程的方式
    python生成器
    python装饰器作业
  • 原文地址:https://www.cnblogs.com/weiok/p/4772771.html
Copyright © 2020-2023  润新知