Git

基本操作

绑定用户名和邮箱地址

(venv) 22-05-17/Users/XXXXX/study/watchlist~%>git --version
git version 2.30.1 (Apple Git-130)
(venv) 22-05-17/Users/xxxxx/study/watchlist~%>git config --global user.nam
e "xxxxxxx"
(venv) 22-05-17/Users/xxxxx/study/watchlist~%>git config --global user.ema
il "xxxxxx@outlook.com"

查看本地分支

test~%>git branch -vv
* flask     71a338f this is a test of microblog project
  flasktest 71a338f this is a test of microblog project
  master    71a338f this is a test of microblog project

查看远程分支

watchlist~%>git branch -r
  origin/master

删除本地分支

microblog/test~%>git branch -d flasktest
Deleted branch flasktest (was 71a338f).

查看配置列表

test~%>git config --list
remote.origin.url=git@github.com:XXXXXX/flasktest.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin

push与pull

push命令

push命令用来将远程分支内容,拉取到本地分支上,当远程分支和本地分支名称一致时,可以省略本地分支名称,push命令中的origin会让人很疑惑

pull命令

push与pull命令参考

建立或删除本地库与远程库的绑定

建立本地库与远程库的绑定关系,和远程库进行绑定时,需要给远程库一个名字,一般来说origin就是默认的名称

xxx/flasky/watchlist~%>git remote add origin git@github.com:xxx/watchlist.git

删除本地库和远程库的绑定,注意这里只是删除了本地库与远程库之间的映射关系,并没有真的删除任何物理内容。

xxx/flasky/watchlist/watchlist~%>git remote rm origin
xxx/flasky/watchlist/watchlist~%>git remote -v

如果有绑定的远程库,命令“git remote -v”会显示如下

现在因为我使用git remote rm origin命令删除了绑定关系,则git remote -v什么都不会显示,因为linux的最大理念就是,“没有消息就是好消息”😊

fatal: refusing to merge unrealated histories

xxxx/flasky/watchlist~%>git pull origin master
From https://github.com/xxxx/watchlist
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

The “fatal: refusing to merge unrelated histories” Git error occurs when two unrelated projects are merged, and two projects are unaware of each other existence and having mismatch commit histories.

To provide a little background .git directory, which is usually hidden, contains all the changes or “commits” of the repo that gets tracked. Rewriting the repository history is possible, but it’s generally not the typical use case. Git is used for version control, which means to track the history of the file.

Use Cases that lead to git fatal: refusing to merge unrelated histories

If you have cloned a repository and, for some reason, the .git folder is corrupted or deleted. Since git will be unaware of your local history, any action you perform like git pull or git push to remote repository will throw this error as there is no tracking information for the current branch.
You have created a new repository, made few commits to it, and now try to pull a remote repository that already has its own commits. Git will throw an error here since it is unaware of how these two projects and commits are related.

The solution to Refusing to merge unrelated histories

The error started occurring from git version 2.9.0 release notes and above. To solve this issue –allow-unrelated-histories flag when pulling the data from remote repository.

解决unrelated histories问题参考

全流程概要

  • 1 绑定用户名和邮箱地址(SSH指纹也提前关联好)
  • 2 mkdir watchlist
  • 3 初始化本地库
xxxx/flasky/watchlist~%>git init
Initialized empty Git repository in /Users/xxxx/Study/flasky/watchlist/.git/
  • 4 绑定本地库与远程库
flasky/watchlist~%>git remote add origin git@github.com:madapapa/watchlist.git
  • 5 查看远程库
xxxx/flasky/watchlist~%>git remote -v
origin	git@github.com:madapapa/watchlist.git (fetch)
origin	git@github.com:madapapa/watchlist.git (push)
  • 6 同步远程库内容,忽略unrelated histories问题
xxxx/flasky/watchlist~%>git pull origin master --allow-unrelated-histories
remote: Enumerating objects: 49, done.
remote: Counting objects: 100% (49/49), done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 49 (delta 16), reused 38 (delta 10), pack-reused 0
Unpacking objects: 100% (49/49), 438.70 KiB | 477.00 KiB/s, done.
From github.com:madapapa/watchlist
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
  • 7 我没有新建gitignore文件

  • 8 在本地修改文件后,进行提交工作

【注意】这里的push命令在第一次使用时,一般建议附带-u参数,这样Git不仅会把本地master分支的内容更新到远程新建的master分支上,还会把本地master和远程的master关联起来,在以后的推送和拉取时就可以简化命令(不需要带-u参数,直接git push即可)。

git常用命令

折腾苹果电脑的zsh

早晨看miguel grinberg的视频,发现他用的iterm2挺好看。然后打开自己的iterm2进行配置,说实话只是简单的配置了绿色字体,但是提示符是没法通过profile来修改的。

随后的2个小时,就是用来折腾zsh,今天算是有了心得。

首先是,修改zshrc的权限(MDMacpro这台电脑)

chmod 666 zshrc

然后修改zshrc

下面是更改颜色,其中省略号部分,全部会改成期望的颜色(这里是蓝色,12,也可以用blue来替代–但是我没有尝试)

%F{12}......%f

%D代表日期(年月日) %d代表当前目录。

非常简洁,而且iterm和terminal的界面会同时更改。

我的另外一台电脑(工作电脑),用了oh my zsh,只要使用

opebn ~/.zshrc

把ZSH_THEME注释掉,就可以使用PS1的方式来修改提示符了。

Python里的__name__究竟有啥用

由于在Pyhton里,并没有一个类似c或其他语言的main()函数,所以当我们把运行python程序的命令传递给所谓解释器,如CPython,或更常见的基于BSD开发的交互式解释器IPython。

比如,使用flask框架进行web编程:

export FLASK_APP = test1.py

通常,解释器会按照第一个没有缩近的代码来顺序执行。
不过,在执行前,解释器会定义一些特殊的变量,__name__就是这种变量。

如果被执行文件是自己被直接执行,那么解释器就会将__name__设置为__main__;如果被执行文件是被import的,那么__name__就会被设置为导入的模块名。

通过对__name__ 变量的检查,我们就可以知道被执行文件是否是被导入的。

下面举个例子:
一个test1.py的文件

print("test1 __name__ is %s"   %__name__)
if __name__ == "__main__":
    print("test1 is being run directly")
else:
    print("test1 is being imported")

输出结果如下

(venv) *****microblog/test/test1.py
test1 __name__ is __main__
test1 is being run directly

test2.py的文件

import test1

print("test2 __name__ is %s " %__name__)

输出结果如下

(venv) *****/microblog/test/test2.py
test1 __name__ is test1
test1 is being imported
test2 __name__ is __main__ 

flask小技巧

“(venv) $ export FLASK_APP=hello.py
(venv) $ export FLASK_DEBUG=1
(venv) $ flask run”

如下,当设置debug为1,允许reloader和debug两种模式,在reloader模式下,程序会自动检测code里的修改,非常方便的功能。

“(venv) $ flask run --help
Usage: flask run [OPTIONS]

  Runs a local development server for the Flask application.

  This local server is recommended for development purposes only but it can
  also be used for simple intranet deployments.  By default it will not
  support any sort of concurrency at all to simplify debugging.  This can be
  changed with the --with-threads option which will enable basic
  multithreading.

  The reloader and debugger are by default enabled if the debug flag of

Options:
  -h, --host TEXT                 The interface to bind to.
  -p, --port INTEGER              The port to bind to.
  --reload / --no-reload          Enable or disable the reloader.  By default
                                  the reloader is active if debug is enabled.
  --debugger / --no-debugger      Enable or disable the debugger.  By default
                                  the debugger is active if debug is enabled.
  --eager-loading / --lazy-loader
                                  Enable or disable eager loading.  By default
                                  eager loading is enabled if the reloader is
                                  disabled.
  --with-threads / --without-threads
                                  Enable or disable multithreading.
  --help                          Show this message and exit.”

Git 小技巧

获取第二章的sample代码

git checkout v0.2

从0.1切换到0.2时,出现如下告警

git checkout v0.2
error: Your local changes to the following files would be overwritten by checkout:
        app/routes.py
Please commit your changes or stash them before you switch branches.
Aborting

我选择放弃本地修改,切换到其他章节的代码,还有几种备选方案,可以看参考。

git reset --hard
HEAD is now at 23b3fc8 Chapter 1: Hello, World! (v0.1)
(venv) XXXXXX microblog % git checkout v0.2
Previous HEAD position was 23b3fc8 Chapter 1: Hello, World! (v0.1)
HEAD is now at 5d45592 Chapter 2: Templates (v0.2)

参考

you have three options:

Commit the change using
git commit -m "My message"
Stash it.
Stashing acts as a stack, where you can push changes, and you pop them in reverse order.

To stash, type

git stash
Do the merge, and then pull the stash:

git stash pop
Discard the local changes
using git reset --hard
or git checkout -t -f remote/branch

Or: Discard local changes for a specific file
using git checkout filename

解决公司电脑无法更新问题

公司发的mac book,是m1芯片,但因为数据安全问题,对于部分权限做了限制,如:无法进行系统更新,需要拿到it部门解决。

前几天我打算重启python编程训练,发现无法安装numpy。

过了两天,灵机一动,在虚拟环境下,venv里进行安装

首先激活虚拟环境

 . venv/bin/activate

然后,在虚拟环境下更新pip

  python -m pip install --upgrade pip
  Requirement already satisfied: pip in ./venv/lib/python3.8/site-packages (22.0.4)

最后,安装numpy

  pip3 install numpy  
  Requirement already satisfied: numpy in ./venv/lib/python3.8/site-packages (1.22.3)

退出虚拟环境

  deactivate 

倒在人工智能黎明的前夜里

4月初,另外一个小组的组长,透露自己小组一名成员刚刚离职,原因也很有意思,“工作环境太恶劣”。

工作环境恶劣?在这个光环环绕的人工智能独角兽体内,每天不用打卡、完全弹性的上下班,每个月只有当工作记录不足40小时,才会被HR提醒的高科技企业,你每天可以享受免费早餐,安静的睡眠仓,口味欠佳但数量管够的膨化食品,怎么会环境恶劣?

追问之下,原来这位同学负责的项目是生产线上的缺陷检测,属于机器视觉领域。他需要经常到生产线上去调试设备,光学设计、镜头选择、数据回流,然后根据算法同学到反馈,重复再重复,一遍得到更加泛化的模型。这些都是人工智能行业最普通不过的工作,而逼迫他辞职,或者让他不能忍受的是,生产线上无孔不入的噪音。

我要来了一段现场手机录制的工作视频,两名戴着隔音耳机的工人,好像机器人一样,把汽车喷涂件从一个位置搬运到另外一个位置,喷涂件在装配台上制造出万箭挠心一般的声响,第一遍我就条件反射一样有呕吐的感觉。

你能想到一个汽车生产线工人要在这样的环境下,工作8个小时,每周5天,每年52周吗?

正如《互联网与中国后现代性抑郁For Public》丽所说的,“当前的问题是现代性问题,是人这个碳基生物和硅基生物之间的深刻矛盾”。“对人性的异化与姓社姓资完全无关”。

这篇文章同时写到:只要人依然以枯燥的方式参与机器的运作,本身就是一种痛苦,对人的异化就会存在。

所以,今后100年,是摆脱枯燥操作的时代。

不过,最先倒下的不是与机器朝夕相处的工人,而是打算改变机器的人工智能先驱们。

如何做调研

调研的目的很重要,是了解客户的需求、核实自己的假设,还是搜寻证据以推动项目进展。甚至很不严肃的把交流、沟通等等活动统一命名为调研,是很常见的现象。这不仅偏离了调研的实质,而且影响了其他商务活动的正常进行。

衡量一次调研是否成功,可以从多个维度评估,例如著名的5W1H(why,who/whom,what,when,where and how),这6个维度还可以螺旋钻取,why之后接着why,触达问题本质。

去年我刚刚经历一次很糟糕的调研。调研对象是国内排名前列的某人口大县。虽然比不上全国第一人口大县安徽临泉(230万),也没法和脚踢北上广的华夏之都曹县相提并论(人口全国第8)。但是作为2020年刚刚摘掉贫困帽子,以猪大肠作为网红美食的湖南西北门户,这段调研经历还是颇为有趣。

首先,没有明确调研负责人

确定调研负责人,未经过任何讨论,很草率的由区域销售担任。她作为接口人,落实调研对象、落实调研计划和场所这类人物,这是胜任的。但是,要一个销售去策划一个5000万综合交通项目的调研工作,即超出她的能力,也超出其职责范围。

调研过程中,销售的话比调研对象多,比客户还清楚问题答案,而且要和客户抢话。全程处于自问自答的。混乱的局面无人把控,从销售的角度看,与客户的热烈讨论气氛,是良好客户关系的证明;而从一个专业调研负责人的角度看,只有确定、对口的问题与答案,才是调研需要的内容。

没有调研负责人,导致调研团队,不知道调研何时开始、何时结束(达到什么样的效果即可停止)。

其次,没有明确的调研目标

没有明确的调研目标。这次调研实际是来了解需求的,而不是接受一次县域交通业务的培训,更不是拉进客户感情的时候。

最后,没有预定调研问题

尽管临时列了若干问题,但没有调研负责人做全面评估,有些问题显得非常小白,问起来的效果似乎是让客户给我们做一次业务普及培训;还有就是没有提问技巧,什么时候问开放问题,什么时候是封闭问题都没有慎重考虑。


今日封控在家,健身小有心得:开始是最困难的,所以一定要让开始的阻力减少,比如不要开始就在脑袋里构思深蹲45个,或者俯卧撑100个。应该这样开始:站在墙角就是胜利✌️,或铺好瑜伽垫就是胜利✌️,剩下的95%随缘。

84岁格拉斯弹琴庆祝生日

54岁的泰森

2016年10月,李宗陶出版了《画在人心的苦闷上》,在书中最后的附录里,她描述自己出差到台湾,为了方便联系同事,开通了微信,在反思三四年的划屏中自己究竟得到了什么,失去了什么,她写道:“失去的很明显,就是时间。得到的,一个是开放的心态和更广泛的新知”。

今天是2022年4月3日,浦西封城的第三天。作为一个上海人的李宗陶,如果让她反思这三年的得与失,不知她作何感想?

有近两周时间没有付费看石康专栏,不知道怎么的,看到他在微博上开始写俄乌战争,突然就不愿意追看专栏,或者确切的说,是想不起来看他的微信专栏。也许,他说的我都已经了然于胸了吧。

昨晚刷饭否,偶得下图。甚感亲切。